(九)无名管道通信

 1.核心理论-通讯

通讯目的

1、数据传输

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

2、资源共享

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

3、通知事件

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

4、进程控制

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

通讯发展

Linux进程间通信(IPC:interprocess communication) 由以下几部分发展而来:

1、UNIX进程间通信

2、基于System V进程间通信

3、POSIX进程间通信

通讯方式

Linux进程间通讯的主要方式有

1、无名管道(pipe)

2、有名管道(FIFO)

3、信号(signal)

4、消息队列

5、共享内存

6、信号量

7、套接字

管道通信

一个进程在管道的尾部写入数据,另一个进程从管道的头部 读出数据。

管道包括无名管道和有名管道两种,

前者只能用 于父进程和子进程间的通信,后者可用于运行于同一系统中 的任意两个进程间的通信

管道通信 -特点

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

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

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

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

5. 管道容量为64KB(#define PIPE_BUFFERS 16 include/linux/pipe_fs_i.h

无名管道

在Linux系统中,无名管道一旦创建完成后,操作无名管道 等同于操作文件。无名管道的读端被视作一个文件;无名管 道的写端也被视作一个文件。

2.函数学习-无名管道

创建管道 pipe

 函数原形: 

 int pipe(int pipefd[2]);

函数功能: 

创建无名管道

所属头文件:   

<unistd.h>

返回值:

成功 0  失败 -1

参数说明:   

pipefd[0]: 读端fd
pipefd[1]:  写端fd

 

综合示例

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

int main()  
{  
    int p[2];
    char buf[128] = {0};
    int ret = -1;

    pipe(p);

    pid_t pid = fork();

    if (pid < 0) {
        perror("fork error");
        return -1;
    }

    if (pid==0) {     // 子进程
        sleep(1);
        close(p[0]);    // 关闭子进程的读端
        write(p[1], "hello world!", 12);
    } else {            // 父进程
        close(p[1]);    // 关闭父进程的写端
        ret = read(p[0], buf, sizeof(buf));

        printf("ret=%d buf=%s\n", ret, buf);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_34863439/article/details/89056747