Linux进程间通信(一)

Linux进程间的通信机制如下图所示:

IPC

1、同主机进程间数据交互机制:无名管道(PIPE)、有名管道(FIFO)、消息队列(Message Queue)和共享内存(Share Memory)。

2、同主机进程间同步机制:信号量(semaphore)。

3、同主机进程间异步机制:信号(Signal)。

4、网络主机间数据交互机制:套接字(Socket)。

 

接下来将针对上述内容,整理一下相关知识,以加深在脑海中的印象?

 

首先介绍无名管道(PIPE),无名管道,又称匿名管道,比较简单。

无名管道的特点:

1)、单工/半双工(单向)的,只能实现从A进程向B进程发送消息。如果想实现双向,则需要用两个管道。

2)、只能在具有亲缘关系的进程中使用,如父子进程、兄弟进程。

3)、传输的数据大小(缓冲区)受限,一般为4096字节。

4)、数据写入在管道缓冲区的末端buf[1],读出在首端buf[0]。

5)、是一种特殊的内存文件,传输完成后,管道自动消失。

6)、很明显,没有名字。

7)、传输的是无格式的字节流,使用时需双方规定好相关解析策略。

一个简单的例子:pipe.c

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

int main(int argc, char *argv[]) 

    pid_t pid; 
    int temp; 
    int pipedes[2]; 
    char s[] = "I am Haven Zhao"; 
    char d[sizeof(s)]; //sizeof在编译期执行,是个常量 
    if(pipe(pipedes) == -1)//创建管道 
    { 
        perror("pipe"); 
        exit(EXIT_FAILURE); 
    }

    if((pid = fork()) == -1) 
    { 
        perror("fork"); 
        exit(EXIT_FAILURE); 
    } 
    else if(pid == 0)//子进程 
    { 
        printf("now,write data to pipe\n"); 
        if((write(pipedes[1], s, 16)) == -1) //写数据到管道 
        { 
            perror("write"); 
            exit(EXIT_FAILURE); 
        } 
        else 
        { 
            printf("the written data is: %s\n"); 
            exit(EXIT_SUCCESS); 
        } 
    } 
    else if(pid &gt; 0) //父进程 
    { 
        sleep(2);//休眠2秒,让子进程先执行 
        printf("now,read data from pipe\n"); 
        if((read(pipedes[0], d, 16)) == -1) 
        { 
            perror("read"); 
            exit(EXIT_FAILURE); 
        } 
        printf("the data from pipe is: %s\n", d); 
    }

    return 0; 
}

 

无名管道的适用情况:

1、用于shell中。例如,使用ps aux|grep Daemon命令,查看进程列表中含有Daemon的进程。

2、用于亲缘进程间通信。上面的实例pipe.c就是。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

anssummer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值