微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 进程间通信之:管道

进程间通信之:管道

时间:08-13 来源:3721RD 点击:

printf("Popen error\n");

exit(1);

}

while ((fgets(buf, BUFSIZE, fp)) != NULL)

{

printf("%s",buf);

}

pclose(fp);

exit(0);

}

下面是该程序在目标板上的执行结果。

$ ./standard_pipe

PID TTY Uid Size State Command

1 root 1832 S init

2 root 0 S [keventd]

3 root 0 S [ksoftirqd_CPU0]

……

74 root 1284 S ./standard_pipe

75 root 1836 S sh -c ps -ef

76 root 2020 R ps –ef

8.2.5 FIFO

1.有名管道说明

前面介绍的管道是无名管道,它只能用于具有亲缘关系的进程之间,这就大大地限制了管道的使用。有名管道的出现突破了这种限制,它可以使互不相关的两个进程实现彼此通信。该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了管道之后,两个进程就可以把它当作普通文件一样进行读写操作,使用非常方便。不过值得注意的是,FIFO是严格地遵循先进先出规则的,对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾,它们不支持如lseek()等文件定位操作。

有名管道的创建可以使用函数mkfifo(),该函数类似文件中的open()操作,可以指定管道的路径和打开的模式。

小知识

用户还可以在命令行使用"mknod 管道名 p"来创建有名管道。

在创建管道成功之后,就可以使用open()、read()和write()这些函数了。与普通文件的开发设置一样,对于为读而打开的管道可在open()中设置O_RDONLY,对于为写而打开的管道可在open()中设置O_WRONLY,在这里与普通文件不同的是阻塞问题。由于普通文件的读写时不会出现阻塞问题,而在管道的读写中却有阻塞的可能,这里的非阻塞标志可以在open()函数中设定为O_NONBLOCK。下面分别对阻塞打开和非阻塞打开的读写进行讨论。

(1)对于读进程。

n 若该管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有数据写入。

n 若该管道是非阻塞打开,则不论FIFO内是否有数据,读进程都会立即执行读操作。即如果FIFO内没有数据,则读函数将立刻返回0。

(2)对于写进程。

n 若该管道是阻塞打开,则写操作将一直阻塞到数据可以被写入。

n 若该管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或者调用失败。

2.mkfifo()函数格式

表8.4列出了mkfifo()函数的语法要点。

表8.4 mkfifo()函数语法要点

所需头文件

#include <sys/types.h>
#include <sys/state.h>

函数原型

int mkfifo(const char *filename,mode_t mode)

函数传入值

filename:要创建的管道

函数传入值

mode:

O_RDONLY:读管道

O_WRONLY:写管道

O_RDWR:读写管道

O_NONBLOCK:非阻塞

函数传入值

mode:

O_CREAT:如果该文件不存在,那么就创建一个新的文件,并用第三个参数为其设置权限

O_EXCL:如果使用O_CREAT时文件存在,那么可返回错误消息。这一参数可测试文件是否存在

函数返回值

成功:0

出错:-1

表8.5再对FIFO相关的出错信息做一归纳,以方便用户查错。

表8.5 FIFO相关的出错信息

EACCESS

参数filename所指定的目录路径无可执行的权限

EEXIST

参数filename所指定的文件已存在

ENAMETOOLONG

参数filename的路径名称太长

ENOENT

参数filename包含的目录不存在

ENOSPC

文件系统的剩余空间不足

ENOTDIR

参数filename路径中的目录存在但却非真正的目录

EROFS

参数filename指定的文件存在于只读文件系统内

3.使用实例

下面的实例包含了两个程序,一个用于读管道,另一个用于写管道。其中在读管道的程序里创建管道,并且作为main()函数里的参数由用户输入要写入的内容。读

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top