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 一些程序逐行处理输入,这样程序就不必等待缓冲区被填满或进程完成才能开始处理输入。
问题是文本存储在内存中但没有打印,因为它没有被刷新。请尝试以下操作:
- 在文本后打印换行符“\n”
- 打印一个非常长的字符串,缓冲区放不下。
如果我在这两种情况下都是正确的,文本应该显示在屏幕上。您还可以使用评论部分中建议的 fflush()
函数 @pmg 来显式刷新文本。
#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 一些程序逐行处理输入,这样程序就不必等待缓冲区被填满或进程完成才能开始处理输入。
问题是文本存储在内存中但没有打印,因为它没有被刷新。请尝试以下操作:
- 在文本后打印换行符“\n”
- 打印一个非常长的字符串,缓冲区放不下。
如果我在这两种情况下都是正确的,文本应该显示在屏幕上。您还可以使用评论部分中建议的 fflush()
函数 @pmg 来显式刷新文本。