- 目的
- 进程通信是比较常用的一种场景,当一个进程在运行中,可以通过另一个进程,发送控制命令到该进程。
- 含义
- fifo格式的文件,和管道类似,只是它是作为文件系统的一部分被访问。
- 一个fifo文件可以被多个进程读或者写,当进程通过fifo交互数据,内核直接将数据端到端传输,而不会写入到文件系统。因此,fifo类型的文件在文件系统里并没有内容。
- fifo只有在读和写进程端都被打开,才能传输数据。
- 进程可以以非阻塞方式打开fifo,通常是默认的阻塞方式。
- 方法
- 判断是否已经有fifo
- 创建fifo
- 打开fifo
- 读fifo,将内容打印出来
-
#include <unistd.h> #include <signal.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> /* Definition of AT_* constants */ #include <sys/stat.h> #include <errno.h> static int quit_flag = 0; char buf[1024]; char *fn="nod"; int fd = 0; void sig(int x) { printf("%s\n", __func__); quit_flag = 1; write(fd, buf, 2); } int main(char argc, char **argv) { signal(SIGINT, sig); if(access(fn, F_OK|R_OK|W_OK) != 0){ unlink(fn); } if(mkfifo(fn, S_IWUSR|S_IRUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) < 0){ printf("failed to create fifo\n"); } if ((fd = open(fn, O_RDWR)) < 0){ printf("failed to open\n"); } while(!quit_flag){ int len = read(fd, buf, sizeof(buf)); printf("len:%d buf:%s\n", len, buf); } }
- 运行结果
- 另外打开一个终端:echo 1 > nod
- 在执行程序的终端,打印: len:2 buf:1
进程通信之fifo
于 2024-06-11 10:20:34 首次发布