练习
两个进程利用管道来进行读写,写一个 write_fifo.c 文件利用
mkfifo
创建管道,以只写的方式打开管道文件,然后创建while
循环,向管道中输入数据,当输入的数据是"quit"
的时候,当前进程结束。再写一个 read_fifo.c 文件利用mkfifo
创建管道,以只读的方式打开 read_filo.c 文中打开的管道文件。然后把数据输出来。当读取到"quit"
数据的时候,进程结束。两个进程结束。
write_fifo.c
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
void
write_file(int fd)
{
char buf[100] = { 0 };
while (1) {
memset(buf, 0, sizeof(buf));
read(fd, buf, sizeof(buf));
if (strncmp(buf, "quit", 4) == 0) {
break;
}
printf("Read: %s", buf);
}
}
int
main(int argc, char const* argv[])
{
int fd;
if (argc != 2) {
printf("usage: %s filename...", argv[0]);
return -1;
}
if (mkfifo(argv[1], 0666) && errno != EEXIST) {
perror("mkfifo()");
return -1;
}
fd = open(argv[1], O_RDONLY);
if (fd < 0) {
perror("open()");
return -1;
}
write_file(fd);
close(fd);
return 0;
}
read_fifo.c
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
void
read_file(int fd)
{
char buf[100] = { 0 };
int n = 0;
while (1) {
memset(buf, 0, sizeof(buf));
fgets(buf, sizeof(buf), stdin);
n = write(fd, buf, sizeof(buf));
if (strncmp(buf, "quit", 4) == 0) {
break;
}
}
}
int
main(int argc, char const* argv[])
{
int fd;
if (argc != 2) {
printf("usage: %s filename...", argv[0]);
return -1;
}
if (mkfifo(argv[1], 0666) && errno != EEXIST) {
perror("mkfifo()");
return -1;
}
fd = open(argv[1], O_WRONLY);
if (fd < 0) {
perror("open()");
return -1;
}
read_file(fd);
close(fd);
return 0;
}