linux c语言编程,使用mkfifo创建FIFO特殊文件,用于进程间通信
发表于: 2018-10-18 19:58:24 | 已被阅读: 27 | 分类于: C语言
使用
mkfifo 函数简介
mkfifo 的原型和所需头文件如下:
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
mkfifo 的返回值
成功返回 0,失败返回 -1,失败码可从
mkfifo 功能
使用
mkfifo 函数的简单使用 demo
以下的 demo,首先创建了一个
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#define FIFO "blog_popkx_com"
int main()
{
char buffer[80];
int fd;
char s[] = "https://blog.popkx.com\n";
unlink(FIFO);
mkfifo(FIFO, 0666);
switch(fork())
{
case -1:
printf("fork failed\n");
break;
case 0:
fd = open(FIFO, O_RDONLY);
int len = read(fd, buffer, 80);
printf("\nlen: %d, %s\n", len, buffer);
close(fd);
break;
default:
sleep(1);
fd = open(FIFO, O_WRONLY);
write(fd, s, sizeof(s));
close(fd);
int childRet = 0;
waitpid(-1, &childRet, 0);
unlink(FIFO);
break;
}
return 0;
}
编译之,执行结果如下:
$ gcc fifo.c
$ ./a.out
len: 24, https://blog.popkx.com
子进程的读取操作被阻塞,直到父进程往
对 FIFO 特殊文件的进一步测试
在子进程中加入延时,如下:
...
switch(fork())
{
case -1:
printf("fork failed\n");
break;
case 0:
sleep(10); // 加入适当延时,便于其他测试
fd = open(FIFO, O_RDONLY);
int len = read(fd, buffer, 80);
printf("\nlen: %d, %s\n", len, buffer);
...
这样一来,就会有一段时间
$ ls -ahl
total 24K
drwxrwxr-x 2 lcc lcc 4.0K 10月 18 19:50 .
drwxrwxr-x 14 lcc lcc 4.0K 10月 18 18:50 ..
-rwxrwxr-x 1 lcc lcc 9.0K 10月 18 19:50 a.out
prw-rw-r-- 1 lcc lcc 0 10月 18 19:50 blog_popkx_com # 占用磁盘空间为 0
-rw-rw-r-- 1 lcc lcc 754 10月 18 19:50 fifo.c
$
$
$ cat blog_popkx_com
https://blog.popkx.com
但是可以使用
$ ps -a|grep a.out
59923 pts/19 00:00:00 a.out
59924 pts/19 00:00:00 a.out