我正在执行这个分配,其中生成了许多子进程,如果它们被中止(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命令本身。
如果不取消就行了。但是,当我尝试中止它时(例如,使用一个睡眠命令,然后输入ctrl-4):
./ntimes 2 sleep 10
^\Quit (Core dumped)它会产生一个垃圾场。我希望父进程打印一条消息。我尝试过信号处理功能和许多其他功能,但我似乎无法使它工作。
发布于 2019-05-11 17:37:35
SIGQUIT以终端的整个前台进程组为目标--它杀死了父进程和子进程。为了防止它杀死父母,您需要:
在使用方法1.时,您需要在执行之前将其解锁/在子节点中对其进行统一处理。使用方法2.,信号处理将在执行时自动默认,因此不会影响子处理程序,但是,至少有一个信号处理程序将打开应用程序,以防止在长阻塞系统(如wait )上出现EINTR错误的可能性,因此您需要对此进行解释。
下面是方法2的一个例子,您可以在例如./a.out sleep 10 #press Ctrl+\ shortly after this上试用它。
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <errno.h>
void h(int Sig){}
int main(int argc, char *argv[])
{
sigaction(SIGQUIT, &(struct sigaction){.sa_handler=h}, 0);
int cont, status, times=1;
pid_t pid;
for(cont = 0; cont < times; cont++)
{
pid = fork();
if(pid == 0)
execvp(argv[1],argv+1);
else if (pid >0) {
// retry on EINTR
int rc; do{ rc=wait(&status); }while(0>rc && EINTR==errno);
if (0>rc) return perror("wait"),1;
if (WIFSIGNALED(status)){
if (WCOREDUMP(status))
printf("Core dump generado\n");
}
}
}
return 0;
}https://stackoverflow.com/questions/56092662
复制相似问题