2-13 无名管道通信

(本节笔记的具体实验代码,在这里

1. Linux中进程间通信(IPC:Inter-Process Communication ) 基本原理

    1.1  作用:

        数据传输,一个进程需要把数据发送到另一个进程。

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

        通知事情,一个进程需要向另一个(组)进程发送消息,通知它们发生了某件事(例如生产者消费者)

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

    1.2  IPC的发展过程

        UNIX进程间通信

        基于System V的进程间通信

        POSIX进程间通信(POSIX Portable Operating System Interface,可移植操作系统接口,不局限于UNIX,其他OS例如Windows也能支持)

    1.3  IPC的主要方式

        无名管道(pipe)

        有名管道(fifo)   (以上两种一般用于数据传输)

        信号(signal)     (通知事件)

        消息队列                  

        共享内存

        信号量                     (资源共享)

        网络套接字socket

    1.4  管道通信

        概念:

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

        分类:

                无名管道,用于父进程和子进程间的通信

                有名管道,用于运行于同一个系统中的任意两个进程间的通信

        特点:

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

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

                当进程去读取空管道时,进程会阻塞;

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

                管道空间为64kb,定义在/include/linux/pipe_fs_i.h里,#define PIPE_BUFFERS 16


2.  无名管道——一旦创建完成后,操作无名管道等同于操作文件

    2.1  创建管道

        函数名:

                pipe

        函数原型:(man 2 pipe)

                int pipe (int pipefd[2]);

        函数功能:

                创建无名管道

        所属头文件:

                <unistd.h>

        返回值:

                成功:返回0    失败:返回-1

        参数说明:

                pipefd[2]:用于返回2个文件描述符

                        pipefd[0]:指向读端

                        pipefd[1]:指向写端

    2.2  管道创建完后,可用read,write,close来对管道进行访问。

    2.3  范例代码:(touch piperw.c)

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>


int main(int argc, char ** argv)

{

    pid_t pid = 0;

    int pipefd[2];

    char c_buf[10];

    pipe(pipefd);

    pid = fork();

    if (pid > 0)

    {

        write(pipefd[1], "hello", 6);

        wait();

        close(pipefd[1]);

        exit(0);

    }

    else

    {

        read(pipefd[0], c_buf,6);

        printf("child read %s\n",c_buf);

        close(pipefd[0]);

        exit(0);

    }

}

                








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值