【发布时间】:2018-05-09 18:49:24
【问题描述】:
我有一个父进程,其中有一个 while 循环。在那个while循环中,我创建了孩子(计数次数)。如果任何孩子发生错误,我不希望将任何其他内容写入标准输出,只需要第一条错误消息。
当发生错误时,我希望程序关闭所有子项和父项,我该怎么做。我正在尝试:
while(count--) {
pid = fork();
if(pid > 0){
wait(NULL);
if(execlp(command1,command2,(char *)NULL) < 0){ // error occured
char str[1024] = "errr";
perror(str);
sprintf(str, "kill -SIGINT %d >> /dev/null 2>&1",getppid());
system(str);
}
}
但它不起作用,它会多次打印错误
我想在发生单个错误时终止/终止程序,以便不打印其他消息
count 是 5,command1 和 command 2 是 "ls"
【问题讨论】:
-
您的父进程坐在那里等待其子进程死亡,但子进程返回循环并再次分叉,第一个子进程现在等待其自己的子进程死亡,然后再与 @987654323 混淆@ 如果成功,它将替换父进程。由于您看到错误消息,
execlp()一定是失败的。由于许多进程中的每一个都失败了,因此您会收到很多消息。很难知道你想做什么,但显然不是你实际在做什么。 -
顺便说一句,如果您显示您的代码,它会更容易为您提供帮助。请阅读如何创建 MCVE (minimal reproducible example)。
-
我试图在发生单个错误时终止/终止程序,以便不打印其他消息
-
顺便提一下,
str应该在传递给perror之前进行初始化,或者perror可以传递 0 或""。 -
也许你应该调用
kill(),在将初始进程设置为进程组负责人之后,向进程组中的所有进程发送 SIGTERM。但如果不知道你被教导了什么,很难猜出什么是合适的。您的代码不会检测到所有错误,进程也不会在报告错误时退出。使用系统运行kill命令是非常重量级的处理。改为调用 kill 函数
标签: c operating-system fork system-calls kill