本文介绍了如何正确地等待前台/后台进程在用C我自己的壳呢?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在 previous问题我贴我的大部分外壳code的。我的下一步是实现前台和后台流程执行和适当等待他们终止让他们不留的植物大战僵尸。

增加在后台运行它们的可能性之前,所有过程进行了在前台运行。执行与execvp任何处理结束后,对于这一点,我简单地称为等待(NULL)()。现在,我检查'和;'字符作为最后一个参数,如果它的存在,通过不调用wait(NULL),这个过程可以在后台运行愉快地在后台运行的过程中会我回到了我的外壳。

这是所有工作正常(我认为),现在的问题是,我还需要调用wait()(或者waitpid函数()?)不知何故,使后台进程不留僵尸。这是我的问题,我不知道该怎么做...

我相信我有处理SIGCHLD,做一些事情,但我还没有完全理解当发送SIGCHLD信号,因为我想还添加等待(NULL)至childSignalHandler(),但它并没有因为随着工作当我在后台执行的过程中,childSignalHandler()函数被调用,因此,等待(NULL),这意味着我不能用我的壳做任何事情,直到背景的过程结束。这是不是在后台,因为在信号处理程序中等待的运行了。

那我在这一切丢失?

最后一件事,这个练习我还需要打印的过程中地位的变化,比如终止进程的一部分。因此,在任何见解也着实AP preciated。

这是目前我的全部code:

 的#include<&stdio.h中GT;
#包括LT&;&stdlib.h中GT;
#包括LT&;&string.h中GT;
#包括LT&;&unistd.h中GT;
#包括LT&;&wait.h GT;
#包括LT&;&signal.h中GT;
#包括LT&; SYS / types.h中>#包括data.h//布尔类型定义和真/假宏
无效childSignalHandler(INT正负号){
    //
}INT主(INT ARGC,字符** argv的){
    炭bBuffer [BUFSIZ],* pArgs [10],* APTR = NULL,*特征码指针;
    布尔背景;
    ssiz​​e_t供rbytes已;
    INT aCount;
    将为pid_t PID;    //信号(SIGINT,SIG_IGN);    信号(SIGCHLD,childSignalHandler);    而(1){
    写(1,\\ E [1; 31mmyBash \\ E [1;32米#\\ E [0米,27);
    rbytes已=读(0,bBuffer,BUFSIZ-1);    如果(rbytes已== -1){
    PERROR(读);
    出口(1);
    }    bBuffer [rbytes已-1] ='\\ 0';    如果(!strcasecmp(bBuffer,退出)){
    出口(0);
    }    特征码= bBuffer;
    aCount = 0;    做{
    APTR = strsep(安培;特征码指针,);
    pArgs [aCount ++] = APTR;
    }而(APTR);    背景= FALSE;    如果(!的strcmp(pArgs [aCount-2],与&)){
    pArgs [aCount-2] = NULL;
    背景= TRUE;
    }    如果(strlen的(pArgs [0])大于1){
    PID =叉();    如果(PID == -1){
    PERROR(叉);
    出口(1);
    }    如果(PID == 0){
    execvp(pArgs [0],pArgs);
    出口(0);
    }    如果(!背景){
    等待(NULL);
    }
    }
    }    返回0;
}


解决方案

有各种选项 waitpid函数()来帮助你(从POSIX标准引号):

In particular, WNOHANG will allow you to see whether there are any corpses to collect without causing your process to block waiting for a corpse.

You probably don't want to be ignoring SIGCHLD, etc, and your signal handler should probably be setting a flag to tell your main loop "Oops; there's dead child - go collect that corpse!".

The SIGCONT and SIGSTOP signals will also be of relevance to you - they are used to restart and stop a child process, respectively (in this context, at any rate).

I'd recommend looking at Rochkind's book or Stevens' book - they cover these issues in detail.

这篇关于如何正确地等待前台/后台进程在用C我自己的壳呢?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-23 15:53