[国嵌攻略][080][无名管道通讯]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[国嵌攻略][080][无名管道通讯]相关的知识,希望对你有一定的参考价值。

通讯目的

1.数据传输

一个进程需要将数据发送给另外一个进程。

2.资源共享

多个进程之间共享同样的资源。

3.通知事件

一个进程需要向另外一个/组进程发送消息,通知它们发生了某事件。

4.进程控制

有些进程希望完全控制另外一个进程的执行,此时控制进程希望能够拦截另外一个进程的所有操作,并能够及时知道它的状态改变。

 

通信方式

1.无名管道(pipe):数据传输

2.有名管道(fifo):数据传输

3.信号(signal):通知事件

4.消息队列

5.内存共享

6.信号量:资源共享

7.套接字(socket)

 

管道通信

一个进程在管道的尾部写入数据,另一个进程从管道的头部读出数据。管道包括无名管道和有名管道两种,前者只能用于父进程和子进程之间的通信,后者可与用于运行与同一系统中的任意两个进程间的通信。

 

管道通信的特点

1.管道通信是单向的,有固定的读端和写端。

2.数据被进程从管道读出后,在管道中该数据就不存在了。

3.当进程去读取空管道的时候,进程会阻塞。

4.当进程往满管道写入数据时,进程会阻塞。

5.管道容量为64KB。

 

无名管道

在Linux系统中,无名管道一旦创建完成后,操作无名管道等同于操作文件。无名管道的读端被视作一个文件,无名管道的写端也被视作一个文件。因此可以使用read,write,close等函数来访问无名管道。

 

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

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

void main(){
    //创建管道
    int pipefd[2];
    
    pipe(pipefd);
    
    //创建进程
    int pid;
    
    pid = fork();
    
    //管道通讯
    if(pid > 0){
        //写入数据
        char wbuf[13] = "hello world!";
        
        write(pipefd[1], wbuf, 13);
        
        //等待读取
        wait(NULL);
        
        //关闭写管道
        close(pipefd[1]);
    }else if(pid == 0){
        //读取数据
        char rbuf[13];
        
        read(pipefd[0], rbuf, 13);
        
        //显示数据
        printf("%s\n", rbuf);
        
        //关闭读管道
        close(pipefd[0]);
    }
    
    //结束进程
    exit(0);
}

 

以上是关于[国嵌攻略][080][无名管道通讯]的主要内容,如果未能解决你的问题,请参考以下文章

[国嵌攻略][085][共享内存通讯]

[国嵌攻略][161][USB总线介绍]

无名管道通讯编程

13.无名管道通讯编程

IPC(进程间的通讯方式)

[国嵌攻略][166][项目管理模型]