我正在执行此分配,在该分配中生成了许多子进程,如果它们中止(ctrl- \或ctrl-4),则应代之以运行父进程。这是代码:
int main(int argc, char *argv[])
{
/* The rest of the code is omitted. "times", "arg1"
and "cmd1" are parameters passed when running the program */
for(cont = 0; cont < times; cont++)
{
pid = fork();
if(pid == 0)
execvp(arg1,cmd1);
else if (pid >0) {
wait(&status);
if (WCOREDUMP(status) !=0)
printf("Core dump generado\n");
}
}
return 0;
}
程序多次运行Linux命令,其中argv[1]
是次数,而arg[2]
,argv[3]
等是Linux命令本身。
如果未取消,则运行良好。但是当我尝试中止它时(例如使用sleep命令,然后输入ctrl-4):
./ntimes 2 sleep 10
^\Quit (Core dumped)
它会生成一个转储。我希望父进程打印一条消息。我已经尝试过信号处理功能和许多其他功能,但是似乎无法使其正常工作。
答案 0 :(得分:1)
SIGQUIT以终端的整个前台进程组为目标-它杀死了父级和子级。 为了防止它杀死父母,您需要执行以下任一操作:
使用方法1,您需要在执行前在子级中取消阻止/忽略它。 使用方法2时,信号处置将在执行时自动默认为默认值,因此不会影响子进程,但是,拥有至少一个信号处理程序将打开您的应用程序,以防止长时间阻塞的系统调用(如{ {1}},因此您需要考虑这一点。
这是方法2的示例。您可以在wait
等上试用。
./a.out sleep 10 #press Ctrl+\ shortly after this