C 分叉:子 proc-meant printf 消息仅在整个程序完成后出现

C forking: child proc-meant printf messages appear only after the whole program finishes

得到这个代码:

static void
prime_test(void)
{
    fprintf(stdout, "child prime_test process started\n");
    int num;
    fprintf(stdout, "enter your num: ");
    fscanf(stdin, "%d", &num);
    fprintf(stdout, "you entered %d\n", num);
    if (num == -1) {
        fprintf(stdout, "-1 is the wrong value\nnow exiting prime_test...\n");
        exit(1);
    }
    int i;
    int  count = 0;
    fprintf(stdout, "processing numbers...\n");
    for (i = 1; i <= num; i++) {
        if (num % i == 0) {
            count++;
            fprintf(stdout, "%d divides %d\n", i, num);
        }
    }
    fprintf(stdout, "---------------------\n");
    fprintf(stdout, "%d has %d divisors\n\n", num, count);
    sleep(1);
}

int
main(void)
{
    system("clear");
    fprintf(stdout, "main() started\n");
    while (1) {
        pid_t pid = fork();
        switch (pid) {
            case -1:
                fprintf(stderr, "failed to fork\n");
                exit(1);
            case 0:
                fprintf(stdout, "now in child\n");
                prime_test();
                break;
            case 1:
                fprintf(stdout, "now in parent\n");
                break;
        }
        if (pid != 0) {
            int child_status;
            pid_t child_pid = wait(&child_status);
            fprintf(stdout, "child process with pid=%d finished\n", child_pid);
            if (WIFEXITED(child_status)) {
                fprintf(stdout, "child process with pid=%d exited with code %d\n", child_pid, child_status);
                break;
            }
        }
        sleep(1);
    }
    return 0;
}

我打印除数,直到用户输入 (-1)。如果 -1 我退出。它工作正常!我的问题是我想让 if (pid != 0) 中的消息在我退出 prime_test() 后立即出现。但是它们只有在我输入-1退出整个程序后才会出现。

想要的不一定是可能发生的。在块 if( pid != 0) 中,您使用了 wait()。这意味着您将阻塞 parent 线程,直到 child 完成执行。语句还打印出 child 已完成执行并打印退出代码。从逻辑上讲,您只能在线程完成后打印退出代码。

现在,如果你想从 parent 中打印一些东西来获得 parent 正在同时执行的感觉,我建议在 [=11= 之前添加 fprintf(stdout,"Parent process waiting for child to complete..."); ] 功能。