linux waitpid 用法,SIGCONT和LINUX中的waitpid()问题

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

我的问题如下:当我向进程发送一个SIGSTOP信号时,执行section // 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();

}

2015-05-18

Forset1

+0

您是否在'waitpid'调用中缺少'WCONTINUED'? –

+0

这样一个简单的解决方案......这正是问题所在。我写了“waitpid(new_pid,&status,WUNTRACED | WNOHANG | WCONTINUED);”它的工作原理。非常感谢! –

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值