命名管道(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

浙公网安备 33010602011771号