【问题标题】:Part of the code in the child process spawned by fork() is skipped跳过由 fork() 生成的子进程中的部分代码
【发布时间】:2017-12-29 03:30:42
【问题描述】:

我使用fork()生成一个子进程来运行一些代码,但是我发现在子进程中,一些像下面printf("child is running");这样的代码不会运行,当我删除switch()中的句子时,它会正常运行,我不明白为什么会发生这种情况。

pid_t pid = fork();
if(pid == 0){
        int execl_status = -1;
        printf("child is running");  // this will not run

        switch(cmdIndex)
        {
            case CMD_1:
                execl_status = execl("./cmd1","cmd1",NULL);
                break;
            case CMD_2:
                execl_status = execl("./cmd2","cmd2",NULL);
                break;
            case CMD_3:
                execl_status = execl("./cmd3","cmd3",NULL);
                break;
            default:
                printf("Invalid Command\n");
                break;
        }
}

【问题讨论】:

  • printf 行更改为printf("child is running\n");。没有\n printf 不会立即刷新stdout,因此它看起来好像还没有被执行。否则我看不到子进程无法运行的另一个原因。您是否还检查过 fork() 没有返回 -1
  • @Pablo 谢谢,这对我有用,你能添加一个答案,我会关闭这个问题。

标签: c linux operating-system


【解决方案1】:

就像我在评论中所说,将您的 printf 行更改为

printf("child is running\n");

当您不在格式字符串末尾使用\n 时,printf 通常不会立即刷新stdout,因此看起来好像没有执行任何操作。

如果您不想打印换行符(无论出于何种原因),您也可以自己刷新stdout

printf("child is running");
fflush(stdout);

我看不出它似乎没有运行的其他原因。另外不要忘记检查fork()是否返回-1,可能您的用户帐户已达到分叉进程的限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 2014-10-21
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多