wait() 之前的语句不会被执行,即使循环不是无限的(但 children 是)。这是为什么?

The statements before wait() aren't being executed, even though the loop isn't infinite (but the children are). Why is that?

#include<stdlib.h>
#include<stdio.h>
  
  
int main()
{
    int j = 0;
    int jump = 1;
    while(1)
    {
        pid_t pid[4];
        for (int i = 0; i < 4; i++)
        {
            if (fork() == 0)
            {
                switch(i)
                {
                    case 0:
                        pid[i] = getpid(); 
                        while(1) {//printf("Parent Process: %d\nChild Process 1: %d\n", getppid(), getpid());
                         sleep(5);}
                        break;
                    case 1:
                        pid[i] = getpid(); 
                        while(1) {//printf("Child Process 2: %d\n", getpid());
                         sleep(5);}
                        break;
                    case 2:
                        pid[i] = getpid(); 
                        while(1) {//printf("Child Process 3: %d\n", getpid());
                         sleep(5);}
                        break;
                    case 3:
                        pid[i] = getpid(); 
                        while(1) {printf("Child Process 4: %d and pid[%d] is %d\n", getpid(), i, pid[i]);
                         sleep(5);}
                        break;
                    default:
                     printf("Something went wrong..");
                }
            }
        }
        printf("why doesn't this print");
        //pid_t killedPid =
        wait(NULL);
        //printf("Child %d Died", killedPid);
        //for (int i = 0; i < 4; i++)
        //{
            //printf("\nTesting against%d: %d\n", i, pid[i]);
            //if (killedPid == pid[i])
            //{
               // j = i;
               // printf("\n\nProcess %d (Child %d) Killed. Recreating Child.\n\n", pid[i], j);
            //}
        //}
        //sleep(4);
        //jump = 4;
    }
    return 0;
}

抱歉,如果代码或问题格式混乱(我是 C 的新手,这是我第一次在这里发帖)。

wait() 之前的 print 语句不会打印,如果我删除 wait() 它会打印。我知道 child 循环是无限的,但据我所知, wait 之前的语句应该由 parent 进程正常执行。

我自己不是专家,但我的印象是没有打印任何内容,因为文本没有刷新到标准输出。在某些编程语言中,当您打印某些内容时,文本不会直接打印出来,而是保存在内存中(在某些情况下也称为缓冲区,例如本文)。这是出于性能原因。有时将大量文本一次打印到标准输出比多次打印少量文本效率更高。

当您“刷新”文本时,您是将其从缓冲区中删除并将其打印到标准输出。这通常会自动完成,例如在进程结束之前或缓冲区已满时。如果我没记错的话,您还可以通过打印换行符“\n”来刷新文本,因为(我不是 100% 确定这是否是实际原因,我在这里推测)在某些系统中,例如 linux 一些程序逐行处理输入,这样程序就不必等待缓冲区被填满或进程完成才能开始处理输入。

问题是文本存储在内存中但没有打印,因为它没有被刷新。请尝试以下操作:

  1. 在文本后打印换行符“\n”
  2. 打印一个非常长的字符串,缓冲区放不下。

如果我在这两种情况下都是正确的,文本应该显示在屏幕上。您还可以使用评论部分中建议的 fflush() 函数 @pmg 来显式刷新文本。