60 lines
1.5 KiB
C
60 lines
1.5 KiB
C
|
// 创建一个父进程和一个子进程,父进程从文件读取数据,并通过管道发送给子进程,子进程将数据输出到标准输出。
|
|||
|
// 例如:父进程从文件读取到的数据为:hello world,子进程将输出:hello world
|
|||
|
#include <stdio.h>
|
|||
|
#include <sys/types.h>
|
|||
|
#include <unistd.h>
|
|||
|
#include <string.h>
|
|||
|
#include <sys/wait.h>
|
|||
|
#include <fcntl.h>
|
|||
|
|
|||
|
int main()
|
|||
|
{
|
|||
|
pid_t pid;
|
|||
|
int fd[2];
|
|||
|
int f = pipe(fd);
|
|||
|
if (f == -1)
|
|||
|
{
|
|||
|
perror("pipe"); // 创建管道失败
|
|||
|
_exit(1); // 创建管道失败,退出
|
|||
|
}
|
|||
|
|
|||
|
pid = fork();
|
|||
|
if (pid == 0)
|
|||
|
{
|
|||
|
close(fd[1]); // 子进程关闭管道写端
|
|||
|
|
|||
|
char buf[32] = "";
|
|||
|
int len = read(fd[0], buf, sizeof(buf));
|
|||
|
// buf[len] = '\0'; // 不加'\0',父进程读取到的数据会有乱码
|
|||
|
printf("子进程收到父进程数据: %s", buf);
|
|||
|
|
|||
|
close(fd[0]); // 关闭管道读端
|
|||
|
_exit(0); // 子进程退出
|
|||
|
}
|
|||
|
|
|||
|
close(fd[0]); // 父进程关闭管道读端
|
|||
|
|
|||
|
int fd_file = open("a.txt", O_RDONLY); // 打开文件
|
|||
|
if (fd_file == -1)
|
|||
|
{
|
|||
|
perror("open");
|
|||
|
_exit(1);
|
|||
|
}
|
|||
|
|
|||
|
char buf[32] = "";
|
|||
|
int len = read(fd_file, buf, sizeof(buf));
|
|||
|
if (len == -1)
|
|||
|
{
|
|||
|
perror("read");
|
|||
|
_exit(1);
|
|||
|
}
|
|||
|
|
|||
|
// 不加'\0',子进程读取到的数据会有乱码
|
|||
|
write(fd[1], buf, strlen(buf) /* + 1 */); // 包括'\0' , 写入管道
|
|||
|
|
|||
|
close(fd[1]); // 关闭管道写端
|
|||
|
close(fd_file);
|
|||
|
waitpid(0, NULL, 0); // 等待子进程退出
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|