把工作放到前台shell实现c

时间:2016-01-01 23:51:07

标签: c linux shell gnu

我正在尝试创建自己的linux shell。我修复了bg命令它正在使用这段代码:

if (strcmp(worte[0], "bg")==0){
      pid_t pidnumber;
      pidnumber=atoi(worte[1]);
      printf("PID: %d", pidnumber);
      kill(pidnumber, SIGCONT);
      return 0;
    } 

但是,fg命令无法正常工作。当我输入“fg 12345”(12345是进程ID)时,它会将该进程置于前台,但我无法使用Ctrl-Z停止它,也不能使用Ctrl-C。我的代码正在关注

if (strcmp(worte[0], "fg")==0){
      pid_t pidnumber;
      pidnumber=atoi(worte[1]);
      tcsetpgrp(0, getpgid(pidnumber));
      waitpid(getpgid(pidnumber), NULL, WUNTRACED);
      tcsetpgrp(0, getpgid(shellpid));

      return 0;
    }

在代码中,worte [0]引用fg,而worte 1引用进程id(例如:12345)。如何帮助我如何解决我的问题。 Please look at the image to see my problem obviously

1 个答案:

答案 0 :(得分:0)

尝试忽略SIGTTOU。

pid_t pidnumber;
pidnumber=atoi(worte[1]);
signal(SIGTTOU, SIG_IGN);
tcsetpgrp(0, getpgid(pidnumber));
signal(SIGTTOU, SIG_DFL);
waitpid(getpgid(pidnumber), NULL, WUNTRACED);
signal(SIGTTOU, SIG_IGN);
tcsetpgrp(0, getpgid(shellpid));
signal(SIGTTOU, SIG_DFL);