关于signal程序的一个思考——进程排队问题

linux中的信号是一种异步通信,所谓“异步”,就是指这个事件发生的时间是无法确定的,他有可能在任何时刻发生。

之所以把标题写成“进程排队问题”,是我对我要提到的问题的思考而已,如果有高人能否决我的观点,我诚心接受。

请看如下c程序:

#include <stdio.h>
#include <stdlib.h> //exit() is used
#include <string.h>
#include <signal.h>
#include <unistd.h>

int wait_mark = 1; //if == 0, exit pause and return

void stop(int signo) {
wait_mark = 0;
}

void waiting() { //to pause if wait_mark != 0
while (wait_mark)
sleep(1);
}

int main(int argc, char *argv[])
{
pid_t pid1, pid2;

// signal(SIGINT, stop);
if (-1 == (pid1 = fork() ) ) {
perror("fork error:");
exit(-1);
}

if (pid1 > 0) {
if (-1 == (pid2 = fork() ) ) {
perror("fork error:");
exit(-1);
}
else if (pid2 > 0) {
signal(SIGINT, stop);
waiting();
kill(pid1, SIGUSR1);
kill(pid2, SIGUSR2);
wait(0);
wait(0);
lockf(1, 1, 0);
printf("parent is now exiting...\n");
lockf(1, 0, 0);
}
else if (pid2 == 0) {
signal(SIGUSR2, stop);
signal(SIGINT, SIG_IGN);
waiting();
lockf(1, 1, 0);
printf("child 2 is now exiting ...\n");
lockf(1, 0, 0);
exit(0);
}
}
else if (pid1 == 0) {
signal(SIGUSR1, stop);
signal(SIGINT, SIG_IGN);
waiting();
lockf(1, 1, 0);
printf("child 1 is now exiting ...\n");
lockf(1, 0, 0);
exit(0);
}

return 0;
}




运行情况大多数是先打印child 1退出的信息,但极少数情况会出现先打印child 2退出的信息。请注意,父进程发信号的时候是先给child 1发出的,见相邻两句kill的顺序。
下面是我从虚拟机vmware6.4安装的ubuntu9.04上运行的结果(注意粗体字部分):

[quote]
canlynet@canlynet-desktop:~/vm_share$ gcc -o signal1 signal1.c
canlynet@canlynet-desktop:~/vm_share$ ./signal1
^Cchild 1 is now exiting ...
child 2 is now exiting ...
parent is now exiting...
canlynet@canlynet-desktop:~/vm_share$ ./signal1
^Cchild 1 is now exiting ...
child 2 is now exiting ...
parent is now exiting...
[b]canlynet@canlynet-desktop:~/vm_share$ ./signal1
^Cchild 2 is now exiting ...
child 1 is now exiting ...
parent is now exiting...[/b]
canlynet@canlynet-desktop:~/vm_share$ ./signal1
^Cchild 1 is now exiting ...
child 2 is now exiting ...
parent is now exiting...
canlynet@canlynet-desktop:~/vm_share$ ./signal1
^Cchild 1 is now exiting ...
child 2 is now exiting ...
parent is now exiting...
canlynet@canlynet-desktop:~/vm_share$ ./signal1
^Cchild 1 is now exiting ...
child 2 is now exiting ...
parent is now exiting...
canlynet@canlynet-desktop:~/vm_share$ ./signal1
^Cchild 1 is now exiting ...
child 2 is now exiting ...
parent is now exiting...
canlynet@canlynet-desktop:~/vm_share$ ./signal1
^Cchild 1 is now exiting ...
child 2 is now exiting ...
parent is now exiting...
canlynet@canlynet-desktop:~/vm_share$ ./signal1
^Cchild 1 is now exiting ...
child 2 is now exiting ...
parent is now exiting...
canlynet@canlynet-desktop:~/vm_share$ ./signal1
^Cchild 1 is now exiting ...
child 2 is now exiting ...
parent is now exiting...
canlynet@canlynet-desktop:~/vm_share$ ./signal1
^Cchild 1 is now exiting ...
child 2 is now exiting ...
parent is now exiting...
canlynet@canlynet-desktop:~/vm_share$ ./signal1
^Cchild 1 is now exiting ...
child 2 is now exiting ...
parent is now exiting...
canlynet@canlynet-desktop:~/vm_share$ ./signal1
^Cchild 1 is now exiting ...
child 2 is now exiting ...
parent is now exiting...
canlynet@canlynet-desktop:~/vm_share$ ./signal1
^Cchild 1 is now exiting ...
child 2 is now exiting ...
parent is now exiting...

[/quote]

关于这个特殊出现的情况,我估计是父进程执行kill的时候速度是很快的,所以万一某一次child 2在系统调度时排列在child 1的后面了,就可能出现child 2先退出的打印语句。
也就是说:大多数情况下父进程执行kill的两句话对子进程1和子进程2来说是对等的,虽然接收到信号有时间先后,但逻辑上没有先后关系,除非父进程执行完一个kill后正好时间片到了或者被打断了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值