如何实现shell的作业控制

How to implement job-control of shell

本文关键字:shell 作业控制 实现 何实现      更新时间:2023-10-16

大家好,我正在使用c++实现linux的shell,但是我在信号方面有一些问题。

这是我的shell的基本逻辑,这是伪代码,但你可以很容易地知道我想做什么。

signal_handler(int sig){
  switch(sig){
    case SIGINT: ... break;
    case SIGTSTP: ... break;
  }
}
main{
  signal(SIGINT,SIG_IGN);
  signal(SIGTSTP, SIG_IGN);
  what main process do{
    wait(&child_pid);
  }
  what child process do{
    signal(SIGINT, signal_handler);
    signal(SIGTSTP, signal_handler);
  }
}

现在我正在使用wait(&fpid)来等待子进程的终止。但是现在我想做一个作业控制功能…我应该为waitpid编码什么样的信号?

我用SIG_IGN来让这个shell的主进程忽略ctrl-cctrl-z信号,即SIGINTSIGTSTP

您需要为主进程创建一个signal_handler,它可以接受ctrl-cctrl-z信号,然后将信号传递给子进程。

这意味着主进程和子进程的信号处理程序应该不同。