Tag: background foreground

如何在C中正确等待我自己的shell中的前台/后台进程?

在上一个问题中,我发布了大部分自己的shell代码。 我的下一步是实现前台和后台进程执行并正确等待它们终止,这样它们就不会像“僵尸”那样停留。 在添加在后台运行它们的可能性之前,所有进程都在前台运行。 为此,我在使用execvp()执行任何进程后简单地调用wait(NULL)。 现在,我检查’&’字符作为最后一个参数,如果它在那里,通过不调用wait(NULL)在后台运行该进程,并且进程可以在后台运行愉快我将返回到我的shell。 这一切都正常(我认为),现在的问题是,我还需要以某种方式调用wait()(或waitpid()?),以便后台进程不会保持“僵尸”。 这是我的问题,我不知道该怎么做…… 我相信我必须处理SIGCHLD并在那里做一些事情,但是我还没有完全理解何时发送SIGCHLD信号,因为我还试图将wait(NULL)添加到childSignalHandler()但是它不起作用因为我一旦在后台执行了一个进程,调用了childSignalHandler()函数,因此等待(NULL),这意味着在“后台”进程完成之前我无法对我的shell做任何事情。 由于信号处理程序中的等待,它不再在后台运行。 我在这一切中缺少什么? 最后一件事,这个练习的一部分我还需要打印进程状态的变化,比如进程终止。 因此,对此的任何见解也非常感激。 这是我目前的完整代码: #include #include #include #include #include #include #include #include “data.h” // Boolean typedef and true/false macros void childSignalHandler(int signum) { // } int main(int argc, char **argv) { char bBuffer[BUFSIZ], *pArgs[10], *aPtr = NULL, *sPtr; bool background; ssize_t rBytes; int aCount; pid_t pid; […]