C 在我自己的shell中创建后台进程
作为我任务的一部分,我正在编写自己的unixshell,我无法处理创建后台进程的问题。我编写了一个信号处理函数,并在代码中实现了必要的部分(从我的角度来看,但显然不够好),如下所示:C 在我自己的shell中创建后台进程,c,shell,unix,C,Shell,Unix,作为我任务的一部分,我正在编写自己的unixshell,我无法处理创建后台进程的问题。我编写了一个信号处理函数,并在代码中实现了必要的部分(从我的角度来看,但显然不够好),如下所示: void handler(int sig) { int pid; int status; pid = wait(NULL); printf("[%d]retval: %d \n", pid, WEXITSTATUS(status)); fflush(stdout); } i
void handler(int sig)
{
int pid;
int status;
pid = wait(NULL);
printf("[%d]retval: %d \n", pid, WEXITSTATUS(status));
fflush(stdout);
}
int main() {
.....
....
struct sigaction sigchild;
memset (&sigchild, 0, sizeof(sigchild));
sigchild.sa_handler = handler;
sigchild.sa_flags = SA_SIGINFO | SA_NOCLDWAIT;
...
...
if(isBackground) //background process
{
sigaction(SIGCHLD, &sigchild, 0);
}
例如,当我输入“sleep5&”,然后输入“ps”查看进程时,没有睡眠。有什么问题吗?提前谢谢 子进程是后台进程。父进程是前台进程。是在子节点终止时发送给父节点的信号。将
if(isbackground
更改为if(!background)
子进程是后台进程。父进程是前台进程。是在子进程终止时发送给父进程的信号。将if(isbackground
更改为if(!background)实际上,我正在像if(isbackground&!child)一样检查它。您希望为正在创建子(后台)进程的父进程提供sigaction
。这将防止僵尸进程。实际上,我正在像if(isBackground&&!child)一样检查它。您希望为正在创建子(后台)进程的父进程提供sigaction
进程。这将防止僵尸进程。与您的问题无关,但您绝对不能在信号处理程序中使用printf()
。您可能会发现信号处理程序中的wait()
也是一场灾难。也许“人3守护程序”可能有帮助吗?好吧,这是对任何事情进行后台监控的最简单的方法。与您的问题无关,但您绝对不能在信号处理程序中使用printf()
。您可能会发现信号处理程序中的wait()
也是一场灾难。也许“人3后台程序”能帮忙吗?好吧,这是对任何事情进行daemonize的最简单的方法。