相关疑难解决方法(0)

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

之前的问题,我最贴出我自己的shell代码.我的下一步是实现前台和后台进程执行并正确等待它们终止,这样它们就不会像"僵尸"那样停留.

在添加在后台运行它们的可能性之前,所有进程都在前台运行.为此,我在使用execvp()执行任何进程后简单地调用wait(NULL).现在,我检查'&'字符作为最后一个参数,如果它在那里,通过不调用wait(NULL)在后台运行该进程,并且进程可以在后台运行愉快我将返回到我的shell.

这一切都正常(我认为),现在的问题是,我还需要以某种方式调用wait()(或waitpid()?),以便后台进程不会保持"僵尸".这是我的问题,我不知道该怎么做......

我相信我必须处理SIGCHLD并在那里做一些事情,但是我还没有完全理解何时发送SIGCHLD信号,因为我还试图将wait(NULL)添加到childSignalHandler()但是它不起作用因为我一旦在后台执行了一个进程,调用了childSignalHandler()函数,因此等待(NULL),这意味着在"后台"进程完成之前我无法对我的shell做任何事情.由于信号处理程序中的等待,它不再在后台运行.

我在这一切中缺少什么?

最后一件事,这个练习的一部分我还需要打印进程状态的变化,比如进程终止.因此,对此的任何见解也非常感激.

这是我目前的完整代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <wait.h>
#include <signal.h>
#include <sys/types.h>

#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;

    //signal(SIGINT, SIG_IGN);

    signal(SIGCHLD, childSignalHandler);

    while(1) {
        write(1, "\e[1;31mmyBash \e[1;32m# \e[0m", 27);
        rBytes = read(0, bBuffer, BUFSIZ-1);

        if(rBytes == -1) {
            perror("read");
            exit(1); …
Run Code Online (Sandbox Code Playgroud)

c signals process background-foreground

8
推荐指数
1
解决办法
3万
查看次数

向后台进程发送信号

我应该将哪个信号发送到后台进程以将其移至前台?SIGTTIN,SIGTOU还是......?

c linux signals

3
推荐指数
2
解决办法
7061
查看次数

标签 统计

c ×2

signals ×2

background-foreground ×1

linux ×1

process ×1