日期:2014-05-16  浏览次数:20653 次

一个关于IPC的程序所产生的疑问。。。求解
关于进程间通信的示例代码:
[code=C/C++][/code]
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>

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;
}
[code=C/C++][/code]

如上代码所示。。
一:(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 。。。这样理解对吗??如果对的话为什么只有父进程能继续输出 而子进程则不输出呢??

希望各位给予解答。。小弟在此万分感谢。。。。(糊涂之处,阻碍极深。。)

------解决方案--------------------
[Quote=引用:]
[Quote=引用:]
[Quote=引用:]
关于进程间通信的示例代码:
[code=C/C++][/code]
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>……
[/Quote]
老哥,嫩不能字少打点啊
1.对
2,你就直接跟我说那种情况下的哪种输出不理解。。你上面那么多种情况不知道你说哪种
还有你说的一定是靠int信号打通子进程的wait跟你说了不一定了,对于子父进程我们可以这样
平行的看父:捕获int--打通自身wait--发10或12给子进程-子进程捕获10或12,打通自身wait
再看子:捕