C 主流程不支持';在函数中调用fork()后不能打印

C 主流程不支持';在函数中调用fork()后不能打印,c,linux,unix,process,fork,C,Linux,Unix,Process,Fork,我试图编写一个shell,但我不明白为什么在createProcess函数结束后,主进程不打印这个“>”。 还有没有更好的方法只打印主流程中的内容?我使用了这个if(mainPid==getpid() 您应该在printf(“>”之后调用fflush(stdout),以确保显示字符串,因为它不会以换行结束,但stdout是行缓冲的。但是,“>”可能会在子进程有机会写入之前显示,实际输出”>process created“ 此外,子进程将无限期地在(;;)中循环,只需比较PID,因此您也应该解决这

我试图编写一个shell,但我不明白为什么在
createProcess
函数结束后,主进程不打印这个
“>”
。 还有没有更好的方法只打印主流程中的内容?我使用了这个
if(mainPid==getpid()


您应该在
printf(“>”
之后调用
fflush(stdout)
,以确保显示字符串,因为它不会以换行结束,但stdout是行缓冲的。但是,
“>”
可能会在子进程有机会写入之前显示,实际输出
”>process created“

此外,子进程将无限期地在(;;)中循环,只需比较PID,因此您也应该解决这个问题

> create

> Process created

Child pid is 5655
所以我对它进行了测试,得到了这个^(注意“processcreated”之前的“>”)。 这意味着它不是按你想要的顺序打印出来的

编辑这是一个修复:

void createProcess(){
      pid_t  pid;
      pid = fork();
      if (pid == 0){
         printf("Process created\n");
         printf("Child pid is %d\n", getpid());
         exit(0);
      }
      if (pid > 0) {
         int stat_loc;
         wait(&stat_loc);
      }
   }
获得以下输出:

> create
Process created
Child pid is 5700
> 

注意,您在子进程中有一个活动循环,这可能会导致意外的副作用

下面是发生的情况

(;;)未终止循环的

|如果parent=>ok,则第一个过程是parent
|叉子
-----------------------------
|(父母)|(子女)
|按预期循环|仍然循环!
|getpid()!=mainPid,因此不会读取任何行
|无限循环。。。
您的循环应该是:

  while (mainPid == getpid()){  // let child terminate...
     printf("> ");
     line = read_line();
     if (line[strlen(line) - 1] == '\n')
        line[strlen(line) - 1] = '\0';
     if (strcmp(line, "create") == 0)
        createProcess();
     else if (strcmp(line, "exit") == 0) break;  // add clean exit...
     else printf("Write \"Create\"\n" );
  }

正确使用Clang编译器…

我想我应该在
printf(“创建的进程”)之后添加一个
sleep(1)
它不会工作,因为它不是线程,它是进程,请查看我的答案以获得修复。感谢我在
createProcess()之后添加
wait(0)
,解决了这个问题
主要。现在我试着理解您的解决方案。如果我想让子进程保持活动状态,不做任何事情,您建议使用哪个函数?是的,我可能会在
printf(“子pid为%d\n”,getpid())之后调用
execvp
exit(0)
> create
Process created
Child pid is 5700
> 
  while (mainPid == getpid()){  // let child terminate...
     printf("> ");
     line = read_line();
     if (line[strlen(line) - 1] == '\n')
        line[strlen(line) - 1] = '\0';
     if (strcmp(line, "create") == 0)
        createProcess();
     else if (strcmp(line, "exit") == 0) break;  // add clean exit...
     else printf("Write \"Create\"\n" );
  }