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