【问题标题】:Child process hanging after call to system()调用 system() 后子进程挂起
【发布时间】:2020-10-27 07:41:49
【问题描述】:

问题是父进程或子进程没有退出。子进程打印它的消息,然后程序挂起。可能会卡在 system() 因为当 system() 调用被删除时不会发生这种情况。 unhide_string() 过滤掉非字母并且 args 在别处定义。传递给 get_page() 的命令“cmd”是有效的。

int get_page(char* cmd) {
    system(cmd);
    return 0;
}

int main() {
    char* args_s = unhide_string(args);
    if (args_s == NULL) {
        printf("Please run me again :)\n");
    }

    if (fork() == 0) {
        get_page(args_s);
        printf("Guess what I did :)\n");
    }
    
    free(args_s);

    return 0;
}

【问题讨论】:

  • system 在该过程完成之前不会返回。如果你打开的东西不会终止,你就会卡住。如果您需要更多控制权,请考虑使用自己的fork/exec
  • 好的,但这是命令:curl --silent --output /dev/null wikipedia.org。在终端中运行它就可以了。那么系统不应该返回吗?
  • 你确定它挂了?您有两个进程:父亲立即完成并将手交还给显示提示的调用 shell。同时,孩子调用 system() 来运行命令,然后显示“猜猜我做了什么:)”。显示在shell提示显示后完成。但是如果你输入 return,你会得到另一个提示 no ?
  • 它“退出”,因为工作目录再次打印,然后在旁边打印“猜猜我做了什么”消息,然后在其下方闪烁光标。该消息仅打印一次。

标签: c fork


【解决方案1】:

通过让父进程等待子进程完成来修复。这允许程序正确终止。

修改分叉代码:

if (fork() == 0) {
    get_page(args_s);
    printf("Guess what I did :)\n");
} else {
    waitpid(-1, NULL, 0);
}

【讨论】:

    猜你喜欢
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 2014-05-18
    • 2018-08-09
    • 2016-11-02
    • 2017-02-28
    相关资源
    最近更新 更多