Linux建立pipe管道函数的方法

誰主沉佛

誰主沉佛

2016-02-19 14:32

最近很多朋友喜欢上设计,但是大家却不知道如何去做,别担心有图老师给你解答,史上最全最棒的详细解说让你一看就懂。

pipe是Linux系统中的管道,管道机制的主体是pipe函数的调用,那么Linux系统要如何建立pipe函数呢?下面图老师小编就给大家介绍下Linux建立pipe函数的方法,一起来了解下吧。

 Linux建立pipe管道函数的方法

● 无名管道

主要用于父进程与子进程之间,或者两个兄弟进程之间。在linux系统中可以通过系统调用建立起一个单向的通信管道,且这种关系只能由父进程来建立。因此,每个管道都是单向的,当需要双向通信时就需要建立起两个管道。管道两端的进程均将该管道看做一个文件,一个进程负责往管道中写内容,而另一个从管道中读取。这种传输遵循先入先出(FIFO)的规则。

● 命名管道

命名管道是为了解决无名管道只能用于近亲进程之间通信的缺陷而设计的。命名管道是建立在实际的磁盘介质或文件系统(而不是只存在于内存中)上有自己名字的文件,任何进程可以在任何时间通过文件名或路径名与该文件建立联系。为了实现命名管道,引入了一种新的文件类型FIFO文件(遵循先进先出的原则)。实现一个命名管道实际上就是实现一个FIFO文件。命名管道一旦建立,之后它的读、写以及关闭操作都与普通管道完全相同。虽然FIFO文件的inode节点在磁盘上,但是仅是一个节点而已,文件的数据还是存在于内存缓冲页面中,和普通管道相同。

1. 函数说明

pipe(建立管道):

1) 头文件 #include《unistd.h》

2) 定义函数: int pipe(int filedes[2]);

3) 函数说明: pipe()会建立管道,并将文件描述词由参数filedes数组返回。

filedes[0]为管道里的读取端

filedes[1]则为管道的写入端。

4) 返回值: 若成功则返回零,否则返回-1,错误原因存于errno中。

错误代码:

EMFILE 进程已用完文件描述词最大量

ENFILE 系统已无文件描述词可用。

EFAULT 参数 filedes 数组地址不合法。

2. 举例

[cpp] view plaincopy

#include 《unistd.h》

#include 《stdio.h》

int main( void )

{

int filedes[2];

char buf[80];

pid_t pid;

pipe( filedes );

pid=fork();

if (pid 》 0)

{

printf( This is in the father process,here write a string to the pipe./n );

char s[] = Hello world , this is write by pipe./n;

write( filedes[1], s, sizeof(s) );

close( filedes[0] );

close( filedes[1] );

}

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/diannaorumen/)

else if(pid == 0)

{

printf( This is in the child process,here read a string from the pipe./n );

read( filedes[0], buf, sizeof(buf) );

printf( %s/n, buf );

close( filedes[0] );

close( filedes[1] );

}

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/diannaorumen/)

waitpid( pid, NULL, 0 );

return 0;

}

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/diannaorumen/)

运行结果:

[root@localhost src]# gcc pipe.c

[root@localhost src]# 。/a.out

This is in the child process,here read a string from the pipe.

This is in the father process,here write a string to the pipe.

Hello world , this is write by pipe.

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/diannaorumen/)

当管道中的数据被读取后,管道为空。一个随后的read()调用将默认的被阻塞,等待某些数据写入。

若需要设置为非阻塞,则可做如下设置:

fcntl(filedes[0], F_SETFL, O_NONBLOCK);

fcntl(filedes[1], F_SETFL, O_NONBLOCK);

上面就是Linux建立pipe管道函数的方法介绍了,需要注意的是,pipe函数需要和fork()配合使用,否则起不到进程间通信的作用。

展开更多 50%)
分享

猜你喜欢

Linux建立pipe管道函数的方法

电脑入门
Linux建立pipe管道函数的方法

Linux函数库的创建方法

电脑入门
Linux函数库的创建方法

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Linux setitimer函数的操作技巧

电脑入门
Linux setitimer函数的操作技巧

在Linux上自动建立帐号

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
在Linux上自动建立帐号

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

linux路由器建立心得

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
linux路由器建立心得

清洗管道污垢的方法是什么

电脑网络
清洗管道污垢的方法是什么

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Windows 8下通知区域的图标管理

Windows 8下通知区域的图标管理

More Effective C++:指针与引用的区别

More Effective C++:指针与引用的区别
下拉加载更多内容 ↓