【问题标题】:creating background processes in my own shell在我自己的 shell 中创建后台进程
【发布时间】:2012-03-14 16:24:28
【问题描述】:

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

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);
}

例如,当我输入“sleep 5 &”然后输入“ps”查看进程时,没有睡眠。可能是什么问题?提前致谢。

【问题讨论】:

  • 与您的问题无关,但您绝对不能在信号处理程序中使用printf()。您可能会发现信号处理程序中的wait() 也是一场灾难。
  • 也许“man 3 daemon”可以提供帮助? Afaik 这是守护几乎任何东西的最简单方法。

标签: c shell unix


【解决方案1】:

子进程是后台进程。父进程是前台进程。 SIGCHLD 是子进程终止时发送给父进程的信号。将if (isbackground 更改为if(!background)

【讨论】:

  • 实际上我正在检查它,就像 if(isBackground && !child)。
  • 您需要 sigaction 用于创建子(后台)进程的父进程。这将阻止僵尸进程。
猜你喜欢
  • 2013-12-24
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
相关资源
最近更新 更多