当前位置: 技术问答>linux和unix
一个关于IPC的程序所产生的疑问。。。求解
来源: 互联网 发布时间:2017-01-24
本文导语: 关于进程间通信的示例代码: #include #include #include #include #include #include void waiting(); void stop(); int wait_mark; int main(void) { int p1,p2; signal(SIGINT,stop); //(0) ...
关于进程间通信的示例代码:
#include
#include
#include
#include
#include
#include
void waiting();
void stop();
int wait_mark;
int main(void)
{
int p1,p2;
signal(SIGINT,stop); //(0)
while((p1 = fork()) == -1);
if(p1 > 0)
{
// signal(SIGINT,stop); //(1)
while((p2 = fork()) == -1);
if(p2 > 0)
{
// signal(SIGINT,stop); //(2)
wait_mark = 1;
waiting(0);
kill(p1,10);
kill(p2,12);
wait(0);
wait(0);
printf("parent process is killed!n");
exit(0);
}
else
{
wait_mark = 1;
signal(12,stop);
waiting();
lockf(1,1,0);
printf("child process 2 is killed by parent!n");
lockf(1,0,0);
exit(0);
}
}
else
{
wait_mark = 1;
signal(10,stop);
waiting();
lockf(1,1,0);
printf("child process 1 is killed by parent!n");
lockf(1,0,0);
exit(0);
}
return 0;
}
void waiting()
{
while(wait_mark != 0);
}
void stop()
{
wait_mark = 0;
}
如上代码所示。。
一:(0)执行,(1)(2)注释,则运行程序后键入ctrl+C 会的如下结果:
child process 1 is killed by parent!
child process 2 is killed by parent!
parent process is killed!
二:若(0)(2)注释,(1)执行。则不显示child process 1 is killed by parent!
三:若(0)(1)注释,(2)执行。则只显示parent process is killed!
最初分析原因:
以 二 为例,第一次fork()创建子进程时子进程也携带了携带了SIGINT的信号检测第二次fork()则没有携带该检测。导致用户键入ctrl+C以后 父进程获取到了所要检测的信号 而 第一个子进程则直接终止,第二个子进程在获得 父进程 发送的信号以后输出并结束,父进程在收到两个子进程都终止的消息后 输出 并结束。三的情况和二相似,只不过是两个子进程都携带了SIGINT的信号检测, 导致用户键入ctrl+C后 子进程全部终止。
基于以上分析带来的问题:
1、依照上面的分析愿意,可判断fork()创建的子进程会携带fork()以后的相关代码信息而fork()之前的子进程则不会携带,这就导致了SIGINT所处位置不同而结果不同的原因(请问这种理解对吗???)
2、在不考虑1的情况下,假设子进程也携带了SIGINT的检测(即子进程代码中也有signal(SIGINT,stop); )则在父进程 收到SIGINT(strl+C)的时候 子进程也收到了该信号,我们知道子进程也是阻塞在waiting()处而此时SIGINT 和 信号10 或12 都能触发stop()导致waiting被打通。那么为什么不继续向下执行从而输出再结束呢??
就像父进程那样。按照代码的执行顺序 我们知道 三个进程都阻塞在waiting()同时获得ctrl+C后总会有一个进程会先执行。但无论谁先执行 两个子进程的waiting()被打通的原因一定是SIGINT 而不是 10或12 。。。这样理解对吗??如果对的话为什么只有父进程能继续输出 而子进程则不输出呢??
希望各位给予解答。。小弟在此万分感谢。。。。(糊涂之处,阻碍极深。。)
#include
#include
#include
#include
#include
#include
void waiting();
void stop();
int wait_mark;
int main(void)
{
int p1,p2;
signal(SIGINT,stop); //(0)
while((p1 = fork()) == -1);
if(p1 > 0)
{
// signal(SIGINT,stop); //(1)
while((p2 = fork()) == -1);
if(p2 > 0)
{
// signal(SIGINT,stop); //(2)
wait_mark = 1;
waiting(0);
kill(p1,10);
kill(p2,12);
wait(0);
wait(0);
printf("parent process is killed!n");
exit(0);
}
else
{
wait_mark = 1;
signal(12,stop);
waiting();
lockf(1,1,0);
printf("child process 2 is killed by parent!n");
lockf(1,0,0);
exit(0);
}
}
else
{
wait_mark = 1;
signal(10,stop);
waiting();
lockf(1,1,0);
printf("child process 1 is killed by parent!n");
lockf(1,0,0);
exit(0);
}
return 0;
}
void waiting()
{
while(wait_mark != 0);
}
void stop()
{
wait_mark = 0;
}
如上代码所示。。
一:(0)执行,(1)(2)注释,则运行程序后键入ctrl+C 会的如下结果:
child process 1 is killed by parent!
child process 2 is killed by parent!
parent process is killed!
二:若(0)(2)注释,(1)执行。则不显示child process 1 is killed by parent!
三:若(0)(1)注释,(2)执行。则只显示parent process is killed!
最初分析原因:
以 二 为例,第一次fork()创建子进程时子进程也携带了携带了SIGINT的信号检测第二次fork()则没有携带该检测。导致用户键入ctrl+C以后 父进程获取到了所要检测的信号 而 第一个子进程则直接终止,第二个子进程在获得 父进程 发送的信号以后输出并结束,父进程在收到两个子进程都终止的消息后 输出 并结束。三的情况和二相似,只不过是两个子进程都携带了SIGINT的信号检测, 导致用户键入ctrl+C后 子进程全部终止。
基于以上分析带来的问题:
1、依照上面的分析愿意,可判断fork()创建的子进程会携带fork()以后的相关代码信息而fork()之前的子进程则不会携带,这就导致了SIGINT所处位置不同而结果不同的原因(请问这种理解对吗???)
2、在不考虑1的情况下,假设子进程也携带了SIGINT的检测(即子进程代码中也有signal(SIGINT,stop); )则在父进程 收到SIGINT(strl+C)的时候 子进程也收到了该信号,我们知道子进程也是阻塞在waiting()处而此时SIGINT 和 信号10 或12 都能触发stop()导致waiting被打通。那么为什么不继续向下执行从而输出再结束呢??
就像父进程那样。按照代码的执行顺序 我们知道 三个进程都阻塞在waiting()同时获得ctrl+C后总会有一个进程会先执行。但无论谁先执行 两个子进程的waiting()被打通的原因一定是SIGINT 而不是 10或12 。。。这样理解对吗??如果对的话为什么只有父进程能继续输出 而子进程则不输出呢??
希望各位给予解答。。小弟在此万分感谢。。。。(糊涂之处,阻碍极深。。)
|
老哥,嫩不能字少打点啊
1.对
2,你就直接跟我说那种情况下的哪种输出不理解。。你上面那么多种情况不知道你说哪种
还有你说的一定是靠int信号打通子进程的wait跟你说了不一定了,对于子父进程我们可以这样
平行的看父:捕获int--打通自身wait--发10或12给子进程-子进程捕获10或12,打通自身wait
再看子:捕获int--打通自身wait
可是你要注意的是这是两段不同内存空间,子进程步骤处理少但不代表快,cpu不会怜香惜玉看你步骤少让你先完的。。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。