命名管道(FIFO)

命名管道解决了管道的一个问题,它除了可以用在有亲缘关系的进程间,也可用在无亲缘关系的进程间。它也仅仅解决了这个问题。

读写操作的特点:

1、同管道一样,单向字节流;

2、open FIFO只读,若现有write端打开,则成功返回;否则,阻塞模式将一直阻塞到打开写,非阻塞模式正常返回;

3、open FIFO只写,若现有read端打开,则成功返回;否则,阻塞模式将一直阻塞到打开读,非阻塞模式正常返回;

4、对于空的FIFO,情形与空管道类似。

看一个例子:

server_fifo
client_fifo
 1 #include "unpipc.h"
 2 
 3 int main(int argc, const char **argv)
 4 {
 5     if (argc != 2) {
 6         fputs("usage; <./client /tmp/fifo.server>\n", stderr);
 7         exit(EXIT_FAILURE);
 8     }
 9 
10     int readfd, writefd;
11     char buf[MAX_BUF] = {0}, fn[30] = {0};
12 
13     if ((writefd = open(argv[1], O_WRONLY)) < 0)
14         SYS_ERR();
15     pid_t pid = getpid();
16     snprintf(fn, sizeof(fn), "/tmp/fifo.%d", pid);
17     if (mkfifo(fn, FILE_MODE) < 0 && errno != EEXIST)
18         SYS_ERR();
19 
20     snprintf(buf, MAX_BUF, "%d ", pid);
21     int len = strlen(buf);
22     if (fgets(buf+len, MAX_BUF-len, stdin) == NULL) 
23         exit(EXIT_FAILURE);
24     if (write(writefd, buf, strlen(buf)) < 0) 
25         SYS_ERR();
26     if ((readfd = open(fn, O_RDONLY, 0)) < 0)
27         SYS_ERR();
28     unlink(fn);
29     int n;
30     while ((n = read(readfd, buf, MAX_BUF)) > 0)
31         buf[n] = 0, fputs(buf, stdout);
32     if (n < 0)
33         SYS_ERR();
34     exit(EXIT_SUCCESS);
35 }

 

管道和FIFO的限制:

OPEN_MAX:一个进程任意时刻可以打开的最大文件描述字数;

PIPE_BUF:可原子的写往一个管道或FIFO的最大字节数。

1 $ ulimit -a

 

posted on 2013-04-22 20:49  逆转的旋律  阅读(360)  评论(0)    收藏  举报

导航