C ++, linux, fork, execvp, waitpid и SIGTSP

Я внедряю терминал для домашней работы.
Я почти закончил, мне просто нужно реализовать команды 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. тем не менее, для Домашней работы мне понадобится это для работы на других системах.

Спасибо!

2

Решение

Чтение официальной ссылки на 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 должен вернуться, когда ожидающий процесс остановлен.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]