C 如何更改子进程中的信号处理程序?

C 如何更改子进程中的信号处理程序?,c,signals,child-process,job-control,C,Signals,Child Process,Job Control,我正在写一个带有作业控制的shell。主进程应忽略停止信号并处理SIGCHLD。fork()之后的子进程应将信号设置为SIG_DFL。问题是我的孩子进程也忽略了信号 在我的程序开始时,我将shell设置为前台并初始化信号 。。。 tcsetpgrp(外壳终端,外壳pgid); 设置_信号(); 无效chld_处理器(内部信号) { if(signum==SIGCHLD) 检查并等待(); 返回; } 无效集_信号(){ sigset\u t集; 结构动作法; sigfillset(&set);

我正在写一个带有作业控制的shell。主进程应忽略停止信号并处理SIGCHLD。fork()之后的子进程应将信号设置为SIG_DFL。问题是我的孩子进程也忽略了信号

在我的程序开始时,我将shell设置为前台并初始化信号

。。。
tcsetpgrp(外壳终端,外壳pgid);
设置_信号();
无效chld_处理器(内部信号)
{
if(signum==SIGCHLD)
检查并等待();
返回;
}
无效集_信号(){
sigset\u t集;
结构动作法;
sigfillset(&set);
sigprocmask(SIG_SETMASK,&set,NULL);
ft_memset(&act,0,sizeof(act));
sigfillset(和act.sa_掩码);
act.sa_handler=SIG_IGN;
sigation(SIGINT,&act,NULL);
sigaction(SIGQUIT,&act,NULL);
sigation(SIGTSTP,&act,NULL);
sigation(SIGTERM和act,NULL);
sigation(SIGTTIN,&act,NULL);
sigation(sigttoo,&act,NULL);
act.sa_handler=chld_handler;
sigaction(SIGCHLD,&act,NULL);
sigpemptyset(&set);
sigprocmask(SIG_SETMASK,&set,NULL);
返回;
}
在子进程中的fork()之后:

/*设置为前台*/
pid=getpid();
如果(!作业->pgid)
作业->pgid=pid;
setpgid(pid,作业->pgid);
tcsetpgrp(shell_终端,作业->pgid);
/*设定信号*/
sigset\u t集;
结构动作法;
sigfillset(&set);
sigprocmask(SIG_SETMASK,&set,NULL);
memset(&act,0,sizeof(act));
sigfillset(和act.sa_掩码);
act.sa_handler=SIG_DFL;
sigpemptyset(&set);
sigprocmask(SIG_SETMASK,&set,NULL);
execve(…);
但是子进程忽略信号

sigaction()
不通过引用存储sigaction对象。 将
act.sa_handler
更改为
act.sa_handler=SIG_DFL
后,需要重复这些
sigaction()
调用

sigaction(SIGINT, &act, NULL);
sigaction(SIGQUIT, &act, NULL);
sigaction(SIGTSTP, &act, NULL);
sigaction(SIGTERM, &act, NULL);
sigaction(SIGTTIN, &act, NULL);
sigaction(SIGTTOU, &act, NULL);

是的,就是这个!非常感谢你!