【问题标题】:putting job into foreground shell implemented c将作业放入前台shell实现的c
【发布时间】:2016-01-01 23:51:06
【问题描述】:

我正在尝试制作自己的 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,worte1 指的是进程 ID(例如:12345)。感谢您的帮助,我该如何解决我的问题。 Please look at the image to see my problem obviously

【问题讨论】:

    标签: c linux shell gnu


    【解决方案1】:

    尝试忽略 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-03
      • 2011-12-04
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 2013-11-29
      • 2010-12-08
      • 1970-01-01
      相关资源
      最近更新 更多