C 为什么不执行子进程?

C 为什么不执行子进程?,c,unix,process,fork,C,Unix,Process,Fork,我有以下代码: int main() { int n = 1; if(fork() == 0) { printf("child"); n = n + 1; exit(0); } n = n + 2; printf("%d: %d\n", getpid(), n); wait(0); return 0; } 问题是我不理解为什么子进程没有执行 仅当我在父进程中设置了sleep(1)时,子进程才会执行 提前感谢。执行子进

我有以下代码:

int main() {
   int n = 1;
   if(fork() == 0) {
      printf("child");
      n = n + 1;
      exit(0);
   }
   n = n + 2;
   printf("%d: %d\n", getpid(), n);
   wait(0);
   return 0;
}
问题是我不理解为什么子进程没有执行

仅当我在父进程中设置了
sleep(1)
时,子进程才会执行


提前感谢。

执行子进程,但有两个进程试图在同一个FD-STDOUT(文件描述符)上写入

如果要查看结果,请将“\n”放在子项的printf中

int main() {
   int n = 1;

   if(fork() == 0) 
   {
     printf("child\n");
     n = n + 1;
     exit(0);
   }
   n = n + 2;
   printf("%d: %d\n", getpid(), n);
   wait(0);
   return 0;
}

子进程被执行,但两个进程试图在同一个FD-STDOUT(文件描述符)上写入

如果要查看结果,请将“\n”放在子项的printf中

int main() {
   int n = 1;

   if(fork() == 0) 
   {
     printf("child\n");
     n = n + 1;
     exit(0);
   }
   n = n + 2;
   printf("%d: %d\n", getpid(), n);
   wait(0);
   return 0;
}
试一试

pid\u t pid;
pid=fork();
if(pid<0)
{
printf(“未能分叉”);
}
否则如果(pid==0)
{
printf(“流动儿童”);
出口(0);
}
其他的
{
打印(“运行母公司”);
等待(0);
打印(“儿童完成”);
}
返回0;
这是我最近写的一个有效程序的基本结构。但我不太清楚为什么你的不起作用

试试看

pid\u t pid;
pid=fork();
if(pid<0)
{
printf(“未能分叉”);
}
否则如果(pid==0)
{
printf(“流动儿童”);
出口(0);
}
其他的
{
打印(“运行母公司”);
等待(0);
打印(“儿童完成”);
}
返回0;
这是我最近写的一个有效程序的基本结构。但我不太清楚为什么你的不起作用

它正在执行,并且应该输出文本。不需要换行符:

可能您没有注意到子文本位于下一个提示的开头:

18188: 3
child[21:17] pskocik@laptop: $
它正在被执行,并且应该输出文本。不需要换行符:

可能您没有注意到子文本位于下一个提示的开头:

18188: 3
child[21:17] pskocik@laptop: $

你怎么知道的?子进程没有做任何事情(可观察)。@tkausl,我在子进程中插入了printf命令..请参阅更新的答案。你怎么知道的?孩子没有做任何事情(可观察)。@tkausl,我在孩子进程中插入了printf命令..请参阅更新的答案。这是我的错误!非常感谢。这是我的错!非常感谢。谢谢你的回答。程序返回3是因为父进程没有收到子进程的值,不是吗?分叉的子进程会得到父进程地址空间的副本(通常是惰性的,即写时复制)。孩子身上的n是另一个n。@Alexandru IonutMihai一切都被复制了。如果您调用了
printf(“foo”)foo
,因为stdio的输出缓冲区包含在“一切”中。(但如果打印了“foo\n”则不会,因为如果输出文件是终端,则
\n
会强制刷新缓冲区)。我现在完全理解了它的工作原理!谢谢!。谢谢你的回答。程序返回3是因为父进程没有收到子进程的值,不是吗?分叉的子进程会得到父进程地址空间的副本(通常是惰性的,即写时复制)。孩子身上的n是另一个n。@Alexandru IonutMihai一切都被复制了。如果您调用了
printf(“foo”)foo
,因为stdio的输出缓冲区包含在“一切”中。(但如果打印了“foo\n”则不会,因为如果输出文件是终端,则
\n
会强制刷新缓冲区)。我现在完全理解了它的工作原理!谢谢!。
18188: 3
child[21:17] pskocik@laptop: $