linux进程间通信--有名管道

有名管道

只有当一个库函数失败时,errno才会被设置。当函数成功运行时,errno的值不会被修改。这意味着我们不能通过测试errno的值来判断是否有错误存在。反之,只有当被调用的函数提示有错误发生时检查errno的值才有意义。

查看错误代码errno是调试程序的一个重要方法。当linux C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因。在实际编程中用这一招解决了不少原本看来莫名其妙的问题。

有名管道比无名管道更强大,它可以让无关联的进程间进行通信。

一个shell命令可以建立一个有名管道

命令格式:

mkfifo[option] name

option选项

mkfifo建立一个name的有名管道

如:

mkfifo fifo1   #建立一个fifo1的有名管道  --p代表管道文件

cat <  fifo1 #通过cat命令对管道进行读数据

ls  > fifo1 #ls命令显示写入管道

删除rm

删除有名管道函数:unlink();

列子:

读文件

#include<sys/types.h>
2 #include<sys/stat.h>
3 #include<errno.h>
4 #include<fcntl.h>
5 #include<stdio.h>
6 #include<string.h>
7 #include<stdlib.h>

9 #define FIFO "/tmp/myfifo"
10 
11 int main(int argc , char**argv)
12 {
13 char buf_r[100];
14 int fd;
15 int nread;
16 if(( mkfifo(FIFO,O_CREAT|O_EXCL) < 0)&&(errno != EEXIST))
17 {
18 printf("can‘t create fifoserver \n");
19 }
20 printf("preparing for reading bytes..\n");
21 memset(buf_r, 0,sizeof(buf_r));
22 fd=open(FIFO,O_RDONLY|O_NONBLOCK,0);
23 if(fd == -1)
24 {
25 perror("open");
26 exit(1);
27 }

28 while(1)
29 {
30 memset(buf_r, 0,sizeof(buf_r));
31 if(nread=read(fd,buf_r ,100)== -1)
32 {
33 if(errno==EAGAIN)
34 printf("no data \n");
35 
36 }
37 printf("read%sfrom FIFO\n",buf_r);
38 sleep(1);
39 }
40 pause();
41 unlink(FIFO);
42 }

写文件

1 #include<sys/types.h>
2 #include<sys/stat.h>
3 #include<errno.h>
4 #include<fcntl.h>
5 #include<stdio.h>
6 #include<stdlib.h>
7 #include<string.h>

9 #define FIFO_SERVER "/tmp/myfifo"
10 
11 int main(int argc , char** argv)
12 {
13 int fd;
14 char w_buf[100]={‘\0‘};
15 int nwrite;
16 if( fd == -1 )
17 {
18 if(errno==ENXIO)
19 printf("open error\n");
20 }
21 fd=open(FIFO_SERVER,O_WRONLY|O_NONBLOCK,0);
22 if(argc == 1)
23 printf("please send something\n");
24 strcpy(w_buf,argv[1]);
25 if( (nwrite = write(fd,w_buf,100) )== -1 )
26 {
27 if( errno == EAGAIN)

28 printf("The FIFO has not been read yet\n");
29 }
30 else
31 printf("write %s to the FIFO\n",w_buf);

时间: 2024-08-06 18:32:58

linux进程间通信--有名管道的相关文章

linux 进程间通信-有名管道(FIFO)

有名管道(FIFO) 命名管道也被称为FIFO文件,是一种特殊的文件.由于linux所有的事物都可以被视为文件,所以对命名管道的使用也就变得与文件操作非常统一. (1)创建命名管道 用如下两个函数中的其中一个,可以创建命名管道. #include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *filename, mode_t mode); int mknod(const char *filename, mode

linux进程间通信-有名管道(FIFO)

有名管道(FIFO) 命名管道也被称为FIFO文件,是一种特殊的文件.由于linux所有的事物都可以被视为文件,所以对命名管道的使用也就变得与文件操作非常统一. (1)创建命名管道 用如下两个函数中的其中一个,可以创建命名管道. #include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *filename, mode_t mode); int mknod(const char *filename, mode

Linux进程间通信之管道

1,进程间通信 (IPC ) Inter-Process Communication 比较好理解概念的就是进程间通信就是在不同进程之间传播或交换信息. 2,linux下IPC机制的分类:管道.信号.共享内存.消息队列.信号量.套接字 3,这篇主要说说管道:本质是文件,其他理论什么的网上已经有一大堆了,我就只写一点用法吧. 3.1 特点 1)管道是最古老的IPC,但目前很少使用     2)以文件做交互的媒介,管道分为有名管道和无名管道     3)历史上的管道通常是指半双工管道 3.2 管道:有

Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)

整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信: 实现机制: 管道是由内核管理的一个缓冲区,相当于我们放入内存中的一个纸条.管道的一端连接一个进程的输出.这个进程会向管道中放入信息.管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息.一个缓冲区不需要很大,它被设计成为环形的数据结构,以便管

Linux 进程间通信之管道(pipe),(fifo)

 无名管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信: 定义函数: int pipe(int filedes[2]) filedes[0]为管道里的读取端 filedes[1]则为管道的写入端. 实现机制: 管道是由内核管理的一个缓冲区,相当于我们放入内存中的一个纸条.管道的一端连接一个进程的输出.这个进程会向管道中放入信息.管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息.一个缓

进程间通信-有名管道

有名管道:无名管道的一个扩展,无名管道是程序运行时存在,有名管道是持久的,一旦创建,所有权限进程都可以访问. 有名管道是单向通道,只能以只读或者只写方式打开.如果要实现双向通信,必须打开两个管道. 有名管道创建:os.mkfifo(path),读写和操作文件一样,open('path', 'w'),open('path', 'r'). 有名管道示例: Process 1 import os P_Name = './pipe' if(os.access(P_Name,os.F_OK) == Fal

linux之有名管道

有名管道1.查看命令:man 3 mkfifo 2.头文件:#include <sys/types.h> #include <sys/stat.h> 3.函数原型:int mkfifo(const char *pathname, mode_t mode);a.*pathname:有名管道的名字 例如:/home/gec/myfifob. mode:八进制的权限, 例如:0777 4.返回值: 成功:0 失败-1 5.函数特点:有名管道存在于文件系统中,提供写入原子性特征,共享内存效

Linux进程间通信:管道

提到进程间通信,我们需要先了解一下进程是什么: 其实在Linux下,早期的Linux为了实现多个程序之间的交替操作,出现了进程的概念.为的就是维护操作系统整个的运行逻辑.并发就是进程间的交替执行. 进程是程序的动态实例. 进程并发运行的环境中,多个进程之间存在如下竞争和合作的关系: -          进程中的资源争用(间接作用) 当并发进程竞争使用同一个资源时,它们之间就会发生冲突.为了避免冲突,当一个进程获得资源时,另一个进程必须等待.这种情况需要通过互斥机制来解决. -         

Linux - 进程间通信 - 匿名管道

一.概念:进程间通信( IPC,InterProcess Communication) 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进城之间要交换数据必须通过内核, 在内核中 开辟一块缓冲区进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内接提供的这种机制成为进程间 通信(IPC,InterProcess Communication). 二.管道 管道分为匿名管道和命名管道,这里我们只讲匿名管道,命名管道的实现将在下一篇文章中分享.