Я внедряю терминал для домашней работы.
Я почти закончил, мне просто нужно реализовать команды bg (Background) и fg (Foreground).
мой код выглядит так:
void run(){
string command[] = parseMyInput( getInput() );
int fork_result = fork();
if( -1 == fork_result )
//handle error
else if( 0 == fork_result ){ // child
setpgrp(); // I don't want the children to get the signals
if( -1 == execvp( command[0], makeArgs(command) ) )
//handle error
}
else { // parent
if( command[ length - 1 ] != "&" ){
int status;
waitpid( fork_result, &status, 0 );
//continue after child is finished
//( need to be here also after a SIGTSTP is raised by ctrl+z )
}
}
Если это процесс переднего плана (если не было ‘&’подписать в конце), затем мне нужно иметь возможность остановить процесс переднего плана (дочерний элемент) с помощью ctrl + z (SIGTSTP), а затем вернуть элемент управления отцу (моему терминалу) с той точки, где он остановился (waitpid).
проблема в том, что после нажатия ctrl + z (и после того, как родительский элемент получит элемент управления в методе обработки сигналов и остановит дочерний элемент с помощью kill (child_pid, SIGTSTP)) родительский элемент не продолжит с того места, где остановился (waitpid ). Я не знаю, где это продолжится после того, как закончится метод обработки сигнала.
Если я вызову run () в методе обработки сигналов, он будет работать, но я не хочу рекурсии. Я предполагаю, что скоро получу StackOverFlow …
Вот код метода обработки сигнала:
void sigtstp_handel( int signal ){
if( is_foreground_process_alive() )
kill( foreground_process_pid, SIGTSTP );
// run();
}
РЕДАКТИРОВАТЬ: я не знаю, если это будет иметь значение, но я использую Linux Ubuntu 12.10. тем не менее, для Домашней работы мне понадобится это для работы на других системах.
Спасибо!
Чтение официальной ссылки на POSIX для waitpid
:
WUNTRACED
The status of any child processes specified by pid that are stopped, and whose status has not yet been reported since they stopped, shall also be reported to the requesting process.
Так что, если вы добавите WUNTRACED
пометить waitpid
call должен вернуться, когда ожидающий процесс остановлен.
Других решений пока нет …