当前位置:  技术问答>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 。。。这样理解对吗??如果对的话为什么只有父进程能继续输出 而子进程则不输出呢??

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

|

老哥,嫩不能字少打点啊
1.对
2,你就直接跟我说那种情况下的哪种输出不理解。。你上面那么多种情况不知道你说哪种
   还有你说的一定是靠int信号打通子进程的wait跟你说了不一定了,对于子父进程我们可以这样
   平行的看父:捕获int--打通自身wait--发10或12给子进程-子进程捕获10或12,打通自身wait
   再看子:捕获int--打通自身wait
   可是你要注意的是这是两段不同内存空间,子进程步骤处理少但不代表快,cpu不会怜香惜玉看你步骤少让你先完的。。

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教:sun中程序执行semid = semget( IPC_PRIVATE, 1, 0600 | IPC_CREAT ),semid < 0,是什么原因?
  • 关于l inux ipc 冲突
  • 求助关于posix ipc 对象创建相关问题
  • 如何使Linux内核支持System V IPC?
  • UNIX系统下的IPC机制
  • shmdt(addr) 和 shmctl(shmid,IPC_RAID,0)有什么区别?
  • Linux IPC 问题
  • LINUX中实现单实例功能使用哪种IPC好啊?
  • ACE与网络IPC的关系是什么?
  • 关于IPC的简单问题
  • 使用ipcrm清理ipc
  • IPC的权限问题
  • 到底还要不要学习System V IPC?
  • 一道ipc的题目
  • ipc里面常用的"管道"和"消息队列"本质上有什么不同?
  • cygwin下ipc共享内存
  • 宏内核系统IPC使用的传递机制是什么
  • android IPC之binder通信机制
  • IPC_CREAT | 0660 的意义是什么?
  • FreeBSD 不支持 POSIX IPC?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3