[国嵌攻略][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);
}
时间: 2024-11-08 22:05:57

[国嵌攻略][080][无名管道通讯]的相关文章

[国嵌攻略][081][有名管道通讯]

有名管道 有名管道又称为FIFO文件,因此我们对有名管道的操作可以采用文件操作的方法,如使用open,read,write等. FIFO文件的特点 1.读取FIFO文件的进程只能以RDONLY方式打开FIFO文件. 2.写入FIFO文件的进程只能以WRONLY方式打开FIFO文件. 3.FIFO文件里面的内容被读取后就消失了,但普通文件里面的内容被读取后还存在. wFIFO.c #include <sys/types.h> #include <sys/stat.h> #includ

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

共享内存 共享内存是IPC机制中的一种,它允许两个相关的进程访问同一段内存,这是传递数据的一种有效的方式. A.c #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #include <string.h> #define SIZE 2048 typedef struct sharemem{ int flag; //共享标志 cha

[国嵌攻略][070-095][Linux编程函数手册]

第1类 时间编程类 1.1 获取日历时间 1.1.1 函数名 time 1.1.2 函数原形 time_t time(time_t *t) 1.1.3 函数功能 返回日历时间 1.1.4 所属头文件 <time.h> 1.1.5 返回值 成功:日历时间失败:-1 1.1.6 参数说明 t:不为空的情况下保存返回值   1.2 获取格林威治时间 1.2.1 函数名 gmtime 1.2.2 函数原形 struct tm *gmtime(const time_t *timep) 1.2.3 函数功

[国嵌攻略][164][USB驱动程序设计]

USB驱动模型 1.USB host controller driver(主控器驱动):为USB主控制器提供驱动程序 2.USB core(USB核心):连接USB主控制器驱动和USB设备驱动 3.USB client driver:为USB外部设备提供驱动程序 USB设备模型 device(设备)->config(配置)->interface(接口)->endpoint(端点),构成了USB设备的四个层次.一个usb driver(驱动)对应的是一个interface(接口).一个接口

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

USB发展史 USB(universal serial bus),通用串行总线,是一种外部总线标准.用于规范电脑与外部设备的连接和通讯.USB是在1994年底由英特尔.康柏.IBM.Microsoft等多家公司联合提出的.自1996年堆出后,已经成功替代了串口和并口.成为当今个人电脑和大量智能设备的必备接口之一. USB1.0出现在1996年,速度只有1.5Mbps.1998年升级为USB1.1,速度也提升到了12Mbps,称之为full speed. USB2.0规范是由USB1.1规范演变而

[国嵌攻略][162][USB协议分析]

USB设备逻辑结构 在USB设备的逻辑组织中,包含设备.配置.接口和端点4个层次.设备通常有一个或多个配置,配置通常有一个或多个接口,接口通常有零个或多个端点. USB设备描述符 当我们把USB设备(例如USB鼠标)插到我们的PC时,主机能够自动识别出我们的USB设备类型.在每一个USB设备内部,包含了固定格式的数据,通过这些数据,USB主机就可以获取USB设备的类型.生产厂商等信息.这些固定格式的数据,我们称之为USB描述符.标准设备有5种USB描述符:设备描述符.配置描述符.接口描述符.端点

[国嵌攻略][155][I2C用户态驱动设计]

用户态驱动模型 用户态驱动模型首先是一个应用程序,其次是在这个用户程序中通过内核调用来驱动设备. IIC通用驱动代码 IIC通用驱动程序的代码在/drivers/i2c/i2c-dev.c中.一次读操作或者一次写操作就是一条消息. EEPROM用户态驱动 IIC通用设备对应/dev/i2c-0设备文件. 1.打开通用设备驱动 2.构造写数据到eeprom的消息 3.使用ioctl写入数据 4.构造从eeprom读数据的消息 5.使用ioctl读出数据 6.关闭设备 配置IIC驱动 make me

[国嵌攻略][057][串口控制台建立]

控制台分类 1.菜单型控制台,通过选择菜单来执行命令 2.解析型控制台,通过输入命令来执行命令 printf().scanf()函数移植 1.函数采用变参 2.打印信息到串口 3.关键在于把变参转换成字符串,相关函数需要从Linux内核或标准C库中移植 va_list args; va_start(args, fmt); vsprintf(buf, fmt, args); va_end(args); /***********************************************

[国嵌攻略][117][LED驱动程序设计]

LED程序设计 1.编写内核模块 2.搭建字符驱动框架 3.实现设备方法 头文件 <linux/io.h> writel() leddev.h //设备命令 #define LED_MAGIC 'L' //LED幻数 #define LED_ON _IO(LED_MAGIC, 0) //打开LED #define LED_OFF _IO(LED_MAGIC, 1) //关闭LED leddev.c /***********************************************