码迷,mamicode.com
首页 > 系统相关 > 详细

操作系统-进程间通信

时间:2018-12-11 21:49:55      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:sprint   .com   code   void   image   情况   roc   识别码   sleep   

响应和发送消息

signal函数

signal(int, fun)

在程序捕获到一个值的时候,调用fun

 

定义函数:int kill(pid_t pid, int sig);
函数说明:kill()可以用来送参数sig 指定的信号给参数pid 指定的进程。参数pid 有几种情况:
1、pid>0 将信号传给进程识别码为pid 的进程.
2、pid=0 将信号传给和目前进程相同进程组的所有进程
3、pid=-1 将信号广播传送给系统内所有的进程
4、pid<0 将信号传给进程组识别码为pid 绝对值的所有进程参数 sig 代表的信号编号可参考附录D

示例程序

# include<stdio.h>
# include<signal.h>
# include<unistd.h>

int wait_mark;

void waiting()
{
    while(wait_mark!=0);
}
void stop()
{
 wait_mark=0;
} 

int main()
{
    int p1, p2;
    signal(SIGINT,stop); //若捕获到GIGINT信号,则执行后面的动作
    while((p1=fork())==-1);//创建第一个进程
    if(p1>0)//如果是父进程
    {
        
        while((p2=fork())==-1);//创建第二个进程
        if(p2>0)//如果是父进程
        {
            wait_mark=1;
            waiting(0);


            //此时按下ctrl + c, 捕获到信号,程序继续往下执行
            kill(p1,10);
            kill(p2,12);
            wait();
            wait();
            printf("parent process is killed!\n");
            exit(0);
        }
        else //如果是p2进程
        {
            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;
}

lockf(1,1,0)是锁定屏幕输出,不让其他进程可以输出到屏幕,lockf(1,0,0)则是解锁

在此程序中注释掉也行

管道的使用

nfc写的已经很好了,我这里就直接cv一下

技术分享图片

 

 技术分享图片

技术分享图片

示例代码

#include <unistd.h>
#include <signal.h>
#include <stdio.h>
int pid1, pid2;
int main()
{
    int fd[2];
    char OutPipe[100], InPipe[100];
    pipe(fd);
    while ((pid1 = fork()) == -1);
    if (pid1 == 0)
    {
        lockf(fd[1], 1, 0);
        sprintf(OutPipe," child 1 process is sending message !");
        write(fd[1], OutPipe, 50);
        sleep(5);
        lockf(fd[1], 0, 0);
        exit(0);
    }
    else 
    {
        while ((pid2 = fork()) == -1);
        if (pid2 == 0)
        {
            lockf(fd[1], 1, 0);
            sprintf(OutPipe,"child 2 process is sending message !");
            write(fd[1], OutPipe, 50);
            sleep(5);
            lockf(fd[1], 0, 0);
            exit(0);
        }
        else
        {
            wait(0);
            read(fd[0], InPipe, 50);
            printf("%s\n", InPipe);
            wait(0);
            read(fd[0], InPipe, 50);
            printf("%s\n", InPipe);
            exit(0);
        }
    }
    return 0;
}

 

操作系统-进程间通信

标签:sprint   .com   code   void   image   情况   roc   识别码   sleep   

原文地址:https://www.cnblogs.com/shensobaolibin/p/10105159.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!