linux中的信号是一种异步通信,所谓“异步”,就是指这个事件发生的时间是无法确定的,他有可能在任何时刻发生。
之所以把标题写成“进程排队问题”,是我对我要提到的问题的思考而已,如果有高人能否决我的观点,我诚心接受。
请看如下c程序:
运行情况大多数是先打印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后正好时间片到了或者被打断了。
之所以把标题写成“进程排队问题”,是我对我要提到的问题的思考而已,如果有高人能否决我的观点,我诚心接受。
请看如下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后正好时间片到了或者被打断了。