用Linux写一段程序,创建命名管道且父子进程都可以读数据和写入数据
时间: 2023-06-18 07:01:57 浏览: 90
linux 命名管道创建及使用demo程序
下面是一个使用 Linux 系统调用创建命名管道的示例程序。该程序创建了一个命名管道,并启动了两个子进程,一个用于写入数据,另一个用于读取数据。
```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
#define FIFO_FILE "/tmp/myfifo"
int main()
{
int fd;
pid_t pid;
char buf[256];
/* 创建命名管道 */
if (mkfifo(FIFO_FILE, 0666) == -1) {
perror("mkfifo");
exit(1);
}
/* 创建子进程1,用于写入数据 */
pid = fork();
if (pid == -1) {
perror("fork");
exit(1);
} else if (pid == 0) {
fd = open(FIFO_FILE, O_WRONLY);
if (fd == -1) {
perror("open");
exit(1);
}
printf("子进程1写入数据中...\n");
write(fd, "Hello, world!\n", strlen("Hello, world!\n"));
close(fd);
exit(0);
}
/* 创建子进程2,用于读取数据 */
pid = fork();
if (pid == -1) {
perror("fork");
exit(1);
} else if (pid == 0) {
fd = open(FIFO_FILE, O_RDONLY);
if (fd == -1) {
perror("open");
exit(1);
}
printf("子进程2读取数据中...\n");
read(fd, buf, sizeof(buf));
printf("子进程2读取到数据:%s", buf);
close(fd);
exit(0);
}
/* 等待子进程结束 */
wait(NULL);
wait(NULL);
/* 删除命名管道 */
if (unlink(FIFO_FILE) == -1) {
perror("unlink");
exit(1);
}
return 0;
}
```
在以上示例程序中,我们使用了 `mkfifo` 系统调用来创建命名管道。该调用的第一个参数是命名管道的路径,第二个参数是权限模式。这里我们使用了 0666 权限模式,表示所有用户都可以读写该命名管道。
接下来,我们使用 `fork` 系统调用创建了两个子进程。第一个子进程用于向命名管道中写入数据,第二个子进程用于从命名管道中读取数据。
在写入数据的子进程中,我们使用了 `open` 系统调用打开了命名管道,并使用 `write` 系统调用向其中写入了一段字符串。在读取数据的子进程中,我们使用了 `open` 系统调用打开了命名管道,并使用 `read` 系统调用从其中读取了数据,并将读取到的数据打印到了控制台上。
最后,我们使用了 `unlink` 系统调用删除了创建的命名管道。
注意,在使用命名管道时,必须保证写入和读取的进程在不同的进程中,否则会出现死锁等问题。
阅读全文