Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在我自己的shell中创建后台进程_C_Shell_Unix - Fatal编程技术网

C 在我自己的shell中创建后台进程

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

作为我任务的一部分,我正在编写自己的unixshell,我无法处理创建后台进程的问题。我编写了一个信号处理函数,并在代码中实现了必要的部分(从我的角度来看,但显然不够好),如下所示:

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的最简单的方法。