Unix IPC之FIFO
#include "unpipc.h" #define FIFO1 "/tmp/fifo.1"
#define FIFO2 "/tmp/fifo.2"
// #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
void client(int, int), server(int, int); int
main(int argc, char **argv)
{
int readfd, writefd;
pid_t childpid; /* 4create two FIFOs; OK if they already exist */
if ((mkfifo(FIFO1, FILE_MODE) < ) && (errno != EEXIST))
err_sys("can't create %s", FIFO1);
if ((mkfifo(FIFO2, FILE_MODE) < ) && (errno != EEXIST))
{
unlink(FIFO1); // 由于err_sys中含有exit函数,这里要在退出之前要删除FIFO1
err_sys("can't create %s", FIFO2);
} if ( (childpid = Fork()) == ) /* child */
{
readfd = Open(FIFO1, O_RDONLY, ); // FIFO1 READ
writefd = Open(FIFO2, O_WRONLY, ); // FIFO2 WRITE server(readfd, writefd);
exit();
}
/* 4parent */
writefd = Open(FIFO1, O_WRONLY, ); // FIFO1 WRITE
readfd = Open(FIFO2, O_RDONLY, ); // FIFO2 READ client(readfd, writefd); Waitpid(childpid, NULL, ); /* wait for child to terminate */ Close(readfd);
Close(writefd); Unlink(FIFO1); // 删除管道FIFO1
Unlink(FIFO2); // 删除管道FIFO2
exit();
} /**
* 现在来看一下上面那个程序
* (假设)服务器代码先运行,因此:
* 当起运行到readfd = open(FIFO1, O_RDONLY, 0);的时候,还没有任何进程以O_WRONLY方式打开FIFO1,进程阻塞在这里;
*
* 然后客户端代码开始运行,但运行到这个地方的时候:writefd = open(FIFO1, O_WRONLY, 0);
* 服务器阻塞的地方开始释放,而在客户端,因为FIFO1在服务器已经是以O_RDONLY打开了,所以继续运行。
*
* 如果客户端的这两个open交换一个顺序
* 那么readfd = open(FIFO2, O_RDONLY, 0);先运行,则由于FIFO2还没有以O_WRONLY方式打开,所以客户端也阻塞,客户和服务器都阻塞
* 大家都在等对方的资源,这种情况我们称之为死锁(deadlock)
*
* 总结:
* writefd = open(FIFO1, O_WRONLY, 0); 这个是用只写方式打开管道,
* 如果FIFO1此时已经有别的进程以只读方式打开(就是说在这条代码运行之前,已经有代码open(FIFO1, O_RDONLY, 0)运行),
* 则此函数返回成功,否则,将会阻塞到有别的进程以只读方式打开FIFO1为止。反过来也一样。
*
*/
2015-08-12 14:55:52
程序的目的及函数介绍请参考:http://www.cnblogs.com/fengkang1008/p/4721478.html
这里用FIFO来替代PIPE。
Unix IPC之FIFO的更多相关文章
- Linux 系统编程 学习:02-进程间通信1:Unix IPC(1)管道
Linux 系统编程 学习:02-进程间通信1:Unix IPC(1)管道 背景 上一讲我们介绍了创建子进程的方式.我们都知道,创建子进程是为了与父进程协作(或者是为了执行新的程序,参考 Linux ...
- Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号
Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号 背景 上一讲我们介绍了Unix IPC中的2种管道. 回顾一下上一讲的介绍,IPC的方式通常有: Unix IPC包括:管道 ...
- c/c++ unix ipc
c/c++ unix ipc 一个例子 //c_unix.c #include <stdio.h> #include <sys/types.h> #include <sy ...
- 进程通信类型 管道是Linux支持的最初Unix IPC形式之一
管道 Linux环境进程间通信(一) https://www.ibm.com/developerworks/cn/linux/l-ipc/part1/index.html 管道及有名管道 郑彦兴200 ...
- 进程通信类型 管道是Linux支持的最初Unix IPC形式之一 命名管道 匿名管道
管道 Linux环境进程间通信(一) https://www.ibm.com/developerworks/cn/linux/l-ipc/part1/index.html 管道及有名管道 郑彦兴200 ...
- Unix IPC之Posix消息队列(1)
部分参考:http://www.cnblogs.com/Anker/archive/2013/01/04/2843832.html IPC对象的持续性:http://book.51cto.com/ar ...
- Unix IPC之共享内存区(1)
1 共享内存区 共享内存区是可用IPC形式中最快的,只有映射和解除映射需要进入内核的系统调用,映射后对共享内存区的访问和修改不再需要系统调用(内核只要负责好页表映射和处理页面故障即可),但通常需要同步 ...
- UNIX IPC: POSIX 消息队列 与 信号
POSIX消息队列可以注册空队列有消息到达时所触发的信号,而信号触发对应的信号处理函数. 下面是一份基本的消息队列和信号处理结合的代码(修改自UNIX网络编程:进程间通信) #include < ...
- Unix IPC之基于共享内存的计数器
目的 本文主要实现一个基于共享内存的计数器,通过父子进程对其访问. 本文程序需基于<<Unix网络编程-卷2>>的环境才能运行.程序中大写开头的函数为其小写同名函数的包裹函数, ...
随机推荐
- xampp+vscode开发php的配置流程
一.所需文件 1.xampp集成服务器(个人使用7.1.7)https://www.apachefriends.org/download.html 2.vscode https://code.visu ...
- Chapter 5(串)
1.kmp #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <str ...
- bzoj 1798 线段树
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 7163 Solved: 2587[Submit ...
- Keepalived LVS-DR单网络双活双主配置模式
Keepalived LVS-DR单网络双活双主配置模式 Linux就该这么学 今天 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统.LV ...
- Html和websocket初识
一.web框架 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. import socket def handle_request(c ...
- Python 装饰器(进阶篇)
装饰器是什么呢? 我们先来打一个比方,我写了一个python的插件,提供给用户使用,但是在使用的过程中我添加了一些功能,可是又不希望用户改变调用的方式,那么该怎么办呢? 这个时候就用到了装饰器.装饰器 ...
- GO_08:GO语言基础之interface
接口interface 1. 接口是一个或多个方法签名的集合 2. 只要某个类型拥有该接口的所有方法签名,即算实现该接口,无需显示声明实现了哪个接口,这称为 Structural typing 3. ...
- PyQt 5.4参考指南 ---- PyQt5和PyQt4之间的差异
欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/in ...
- COGS 5. P服务点设置
5. P服务点设置 http://www.cogs.pro/cogs/problem/problem.php?pid=5 ★★ 输入文件:djsc.in 输出文件:djsc.out 简单对 ...
- .NET 定时器类及使用方法
Timer类实现定时任务 //2秒后开启该线程,然后每隔4s调用一次 System.Threading.Timer timer = new System.Threading.Timer((n) =&g ...