请用c语言编写两个Linux下的程序,一个用于读文件,一个用语言写文件。其中读文件的程序里创建文件,并且作为main()函数里的参数由用户输入要写入的内容。读文件的程序会读出用户写到文件的内容,这两个程序采用的是阻塞式对鞋管道模式。文件目录为/tmp/fifo
时间: 2024-03-27 15:41:24 浏览: 65
读文件的程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#define FIFO_PATH "/tmp/fifo"
int main() {
char buf[1024];
int fd;
pid_t pid;
if (access(FIFO_PATH, F_OK) == -1) {
if (mkfifo(FIFO_PATH, 0666) == -1) {
perror("mkfifo");
exit(EXIT_FAILURE);
}
}
printf("Waiting for the writer ...\n");
if ((fd = open(FIFO_PATH, O_RDONLY)) == -1) {
perror("open");
exit(EXIT_FAILURE);
}
printf("Reading ...\n");
while (1) {
ssize_t n = read(fd, buf, sizeof(buf));
if (n == -1) {
perror("read");
exit(EXIT_FAILURE);
} else if (n == 0) {
printf("Writer closed the pipe\n");
exit(EXIT_SUCCESS);
} else {
printf("%s", buf);
}
}
close(fd);
exit(EXIT_SUCCESS);
}
```
写文件的程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#define FIFO_PATH "/tmp/fifo"
int main() {
char buf[1024];
int fd;
if (access(FIFO_PATH, F_OK) == -1) {
if (mkfifo(FIFO_PATH, 0666) == -1) {
perror("mkfifo");
exit(EXIT_FAILURE);
}
}
printf("Enter the content to write: ");
fgets(buf, sizeof(buf), stdin);
if ((fd = open(FIFO_PATH, O_WRONLY)) == -1) {
perror("open");
exit(EXIT_FAILURE);
}
ssize_t n = write(fd, buf, sizeof(buf));
if (n == -1) {
perror("write");
exit(EXIT_FAILURE);
}
close(fd);
exit(EXIT_SUCCESS);
}
```
这两个程序采用的是阻塞式的管道模式。读文件的程序会一直阻塞在 `read` 函数上,直到有数据可读,而写文件的程序会一直阻塞在 `write` 函数上,直到数据被写入管道中。需要注意的是,在使用管道时,写入数据的大小不能超过管道的缓冲区大小,否则会导致写入失败或者读取不完整。
阅读全文