what is the relation between SIGTSTP and SIGCHLD

Posted by Rawhi on Stack Overflow See other posts from Stack Overflow or by Rawhi
Published on 2013-11-09T21:48:26Z Indexed on 2013/11/09 21:53 UTC
Read the original article Hit count: 203

Filed under:
|
|
|

I have tow handlers for each one of them (SIGTSTP, SIGCHLD), the thing is that when I pause a process using SIGTSTP the handler function of SIGCHLD run too. what should I do to prevent this .

void ExeExternal(char *args[MAX_ARG], char* cmdString, LIST_ELEMENT** pList, int *Susp_Bg_Pid, int *susp) {
int pID, status, w;
switch (pID = fork()) {
case -1:
    perror("smash error: >");
    break;
case 0:
    // Child Process
    setpgrp();
    execv(args[0], args);
    execvp(args[0], args);
    perror("error");
    exit(EXIT_FAILURE);
    break;
default:
    if (cmdString[strlen(cmdString) - 1] != '&') {
        *Susp_Bg_Pid = pID;
        *susp = 1;
        while(*susp);
    } else {
        InsertElem(pList, args[0], getpid(), pID, 0);
    }
    break;
}
}

signal handlers :

void signalHandler(int signal) {
int pid, cstatus;
if (signal == SIGCHLD) {
    susp = 0;
    pid = waitpid(-1, &cstatus, WNOHANG);
    printf("[[child %d terminated]]\n", pid);
    DelPID(&JobsList, pid);
}
}

void ctrlZsignal(int signal){
    kill(Susp_Bg_Pid, SIGTSTP);
    susp = 0;
    printf("\nchild %d suspended\n", Susp_Bg_Pid);
}

Susp_Bg_Pid used to save the paused process id.
susp indicates the state of the "smash" the parent process if it is suspended or not .

© Stack Overflow or respective owner

Related posts about c

    Related posts about linux