I'm implementing a Terminal for a Home Work.
I almost finished, I just need to implement a bg ( Background ) and a fg ( Foreground ) commands.
my code looks like this:
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 )
}
}
If it is a foreground process ( if there wasn't a '&' sign at the end ) then I need to be able to stop the foreground process ( the child ) with ctrl+z ( SIGTSTP ) and then to return the control to the father ( my terminal ) from the point it stopped ( waitpid ).
the problem is that after a ctrl+z is pressed, ( and after the parent get the control in the signal handle method and stop the child using kill( child_pid, SIGTSTP ) ) the parent don't continue from where it stopped ( the waitpid ). I don't know where it continue after the signal handling method is finished.
If I call run() at the signal handling method it will work, but I don't want the recursion. I'm guessing I'll get a StackOverFlow very soon...
here is the code of the Signal Handling Method:
void sigtstp_handel( int signal ){
if( is_foreground_process_alive() )
kill( foreground_process_pid, SIGTSTP );
// run();
}
EDIT: I don't know if it will matter, but I'm using a Linux Ubuntu 12.10. nevertheless, for the Home Work, I'll need it to work on other systems.
Thanks!