在LINUX中使用SIGCONT和waitpid()的问题

时间:2015-05-18 15:59:48

标签: linux shell handler

我会尽量保持简单。我正在为LINUX复制一个shell。我使用链表结构“job_list”来存储所有后台进程。如果后台进程终止,则将其从列表中删除。如果后台进程暂停,则其在列表中的状态将从BACKGROUND更改为STOPPED。如果重新唤醒进程(通过SIGCONT信号),那么想法是列表中的进程状态应该更改回BACKGROUND。

我的问题如下:当我向进程发送SIGSTOP信号时,执行// 1部分并在列表中成功注册其状态更改。但是,当我使用SIGCONT信号重新唤醒相同的进程时,WIFCONTINUED(status)将返回false,但WIFEXITED(status)将始终返回true。因此,执行第// 3节并从列表中删除该过程。

可能有什么不对?提前谢谢。

void sigchld_handler (){

block_SIGCHLD();


job *item;
int l_size = list_size(job_list);
int i, new_pid, pid_wait, status, info;
enum status status_res;

for (i = 1; i <= l_size; i++){



    item =  get_item_bypos(job_list, i);
    new_pid = item->pgid;
    pid_wait = waitpid(new_pid, &status, WUNTRACED | WNOHANG);



    if (WIFSTOPPED(status)){
        //1
        printf("****SUSPENDED\n");
        item->state = STOPPED;  

    }else if (WIFCONTINUED(status)){
        //2
        printf("****CONTINUED\n");
        item->state = BACKGROUND;

    }else if (WIFEXITED(status)){
        //3
        printf("****EXITED\n");
        l_size--;
        i--;
        delete_job(job_list, item); 

    }
}

print_job_list(job_list);
unblock_SIGCHLD();

}

1 个答案:

答案 0 :(得分:1)

您在WCONTINUED的通话中似乎缺少waitpid值。

来自waitpid specification

pid_t waitpid(pid_t pid, int *stat_loc, int options);
     

options参数是从头部中定义的零个或多个以下标志的按位包含OR构造的:

     

WCONTINUED

     

waitpid()函数应报告pid指定的任何继续子进程的状态,该进程的状态自作业控制停止后继续报告。