关键代码
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#define FIFO_NAME "myfifo"
#define BUFFER_SIZE 100
int main() {
// 创建命名管道
int mkfifo_status = mkfifo(FIFO_NAME, 0666);
if (mkfifo_status == -1 && errno != EEXIST) {
perror("mkfifo");
return 1;
}
// 创建子进程
pid_t pid = fork();
if (pid == -1) {
perror("fork");
return 1;
} else if (pid == 0) {
// 子进程 - 写管道
int fd = open(FIFO_NAME, O_WRONLY);
if (fd == -1) {
perror("open for writing");
return 1;
}
const char *message = "Hello, Pipe!";
ssize_t write_status = write(fd, message, strlen(message) + 1);
if (write_status == -1) {
perror("write");
}
close(fd);
} else {
// 父进程 - 读管道
int fd = open(FIFO_NAME, O_RDONLY);
if (fd == -1) {
perror("open for reading");
return 1;
}
char buffer[BUFFER_SIZE];
ssize_t read_status = read(fd, buffer, BUFFER_SIZE);
if (read_status == -1) {
perror("read");
} else {
printf("Read from pipe: %s\n", buffer);
}
close(fd);
wait(NULL);
unlink(FIFO_NAME);
}
return 0;
}
可能出现的错误及处理方法
- mkfifo失败:如果
mkfifo
函数调用失败,且errno
不是EEXIST
(表示管道已存在),则说明创建命名管道出错。可以通过perror
函数打印错误信息,然后退出程序。
- fork失败:
fork
函数用于创建子进程,如果失败,通过perror
打印错误信息并退出程序。
- open失败:无论是以写模式还是读模式打开命名管道,如果
open
函数调用失败,通过perror
打印错误信息并退出程序。写模式打开失败可能是因为管道不存在或者权限问题;读模式打开失败可能是因为管道未创建或者权限不足。
- write失败:在向管道写入数据时,如果
write
函数调用失败,通过perror
打印错误信息。这可能是因为管道的另一端未打开,或者磁盘已满等原因。
- read失败:从管道读取数据时,如果
read
函数调用失败,通过perror
打印错误信息。可能是因为管道未正确写入数据,或者管道已关闭等原因。