zoukankan      html  css  js  c++  java
  • 进程通信——司机售票员问题

    编程用fork()创建一个子进程代表售票员,司机在父进程中,再用系统调用signal()让父进程(司机)捕捉来自子进程(售票员)发出的中断信号,让子进程(售票员)捕捉来自(司机)发出的中断信号,以实现进程间的同步运行。 

    3、编制一段程序,实现进程的管道通信。使用pipe()建立一条管道线。两个子进程p1和p2分别向管道各写一句话:

           Child 1 is sending message!

           Child 2 is sending message!

    而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。

     1 #include <stdio.h>
     2 #include <sys/types.h>
     3 #include <signal.h>
     4 #include <unistd.h>
     5 void saler(int);     //售票员信号处理函数
     6 void driver(int);    //司机信号处理函数
     7 pid_t pid;  //保存子进程号
     8 int main()
     9 {
    10     if ((pid = fork()) == -1)
    11     {
    12         perror("fork");
    13         return -1;
    14     }
    15     if (pid == 0)  //子进程(售票员)
    16     {
    17         signal(SIGINT, saler);    //处理SIGINT信号,不退出进程(如果不注册该信号,则会本进程会退出)。注:ctrl+c可向所有进程发送退出信号,默认退出所有进程
    18         signal(SIGQUIT, saler);    //处理SIGQUIT信号,不退出进程。注:ctrl+可向所有进程发送退出信号,默认退出所有进程
    19         signal(SIGUSR1, saler); //处理用户自定义信号SIGUSR1
    20         signal(SIGTSTP, SIG_IGN);  //忽略SIGTSTP信号。注:ctrl+z可向所有进程发送该信号,暂停所有进程
    21         while (1)
    22             pause();
    23     }
    24     else  //父进程(司机)
    25     {
    26         signal(SIGINT, SIG_IGN);
    27         signal(SIGQUIT, SIG_IGN);
    28         signal(SIGTSTP, driver);
    29         signal(SIGUSR1, driver);
    30         signal(SIGUSR2, driver);
    31         while (1)
    32             pause();
    33     }
    34     return 0;
    35 }
    36 
    37 void saler(int no)
    38 {
    39     if (no == SIGINT)
    40         kill(getppid(), SIGUSR1);  //如果接收到SIGINT信号,则向父进程(司机)发送SIGUSR1信号
    41     if (no == SIGQUIT)
    42         kill(getppid(), SIGUSR2);
    43     if (no == SIGUSR1)
    44     {
    45         printf("please get off the bus!
    ");
    46         kill(0, SIGKILL);  //杀死该进程组的所有进程
    47     }
    48 }
    49 
    50 void driver(int no)
    51 {
    52     if (no == SIGUSR1)
    53         printf("let's gogogo!
    ");
    54     if (no == SIGUSR2)
    55         printf("stop the bus!
    ");
    56     if (no == SIGTSTP)
    57         kill(pid, SIGUSR1);  //如果接受到SIGTSTP信号,则向子进程(售票员)发送SIGUSR1信号
    58 }

  • 相关阅读:
    QT移植详解
    如何构建Qt4.7.0嵌入式开发环境
    Qt触摸屏、键盘的驱动[转]
    【详解】如何编写Linux下Nand Flash驱动
    QT安装 -->Error: register or shift expression expected -- `orr r3,r2,lsl#16'
    QT环境搭建常见的bug解决 -->ld: cannot find –lbootstrap 错误
    SDK支付流程
    IOS与Unity交互
    Android
    [转]个人对AutoResetEvent和ManualResetEvent的理解
  • 原文地址:https://www.cnblogs.com/WangYiqiang/p/9561760.html
Copyright © 2011-2022 走看看