2016-01-01 2 views
0

Я пытаюсь создать свою собственную оболочку linux. У меня исправлена ​​команда bg, которая работает с этим кодом:Выполнение задания в оболочку переднего плана c

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 - это идентификатор процесса), он переносит этот процесс на передний план, но я не могу остановить его с помощью 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 относится идентификатор процесса (например: 12345). Как я могу решить свою проблему, спасибо за помощь. Please look at the image to see my problem obviously

ответ

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); 
Смежные вопросы