通过ctrl键中止子进程时,父进程未运行-\
我正在执行这个任务,其中生成了许多子进程,如果它们被中止(ctrl-\或ctrl-4),则应该运行父进程。代码如下:通过ctrl键中止子进程时,父进程未运行-\,c,C,我正在执行这个任务,其中生成了许多子进程,如果它们被中止(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 < t
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;
}
它生成一个转储。我希望父进程改为打印消息。我尝试过信号处理功能和许多其他功能,但似乎无法使其正常工作。SIGQUIT针对终端的整个前台进程组,它会杀死父进程和子进程。 要防止它杀死父级,您需要:
wait
)时可能出现EINTR错误,因此您需要对此进行说明
下面是方法2的一个示例。您可以尝试使用它,例如,/a.out sleep 10#在此之后不久按Ctrl+\键
#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;
}
#包括
#包括
#包括
#包括
#包括
#包括
空h(int-Sig){}
int main(int argc,char*argv[])
{
sigaction(SIGQUIT,&(struct-sigaction){.sa_handler=h},0);
int cont,状态,时间=1;
pid_t pid;
对于(cont=0;cont0){
//在EINTR上重试
int rc;do{rc=wait(&status);}while(0>rc&&EINTR==errno);
如果(0>rc)返回perror(“等待”),则为1;
if(WIFSIGNALED(状态)){
如果(WCOREDUMP(状态))
printf(“核心转储generado\n”);
}
}
}
返回0;
}
当您通过终端发送信号时,所有进程都会发出信号。如果您希望父进程在接收到将终止它的信号后继续,则必须设置适当的信号处理-可能是与和朋友一起设置。你说你已经尝试过信号处理函数,但你没有展示代码。我们无法修复你没有展示给我们的东西,是吗?请注意,您应该在execvp()
之后执行某种退出操作,以处理无效(未知)命令,最好还有一条错误消息。表面上看,您的execvp()
行应该是execvp(argv[2],&argv[2])
将命令名和参数向前传递。我编译了上面发布的全部代码,当使用sleep 10作为参数运行它时,然后通过ctr中止它-\stil我得到了“core dumped”消息。它对你有用吗?@Cvg是的。我得到了“核心转储generado”。
#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;
}