Loading

用C 写一个小小的通道

用C语言写一个简单的拷贝函数

1. 前置知识点

Linux 下的fork(), 是用来创建子进程的函数,特点是返回值在子进程内部看是0,但是在父进程看来就是此子进程的pid
Linux 下的open,read, write 函数,大家可以的话去man 指令看一下这几个函数的解析

man open
man fork
man read
man write

其中open的参数形式是

open(char *filepath, int flags, int mode);
// 这里的filepath就是指文件的路径
// flags是指打开文件的模式,是直接打开,是可读还是可选
// mode 是指具体flag下可以执行的操作,这里面涉及到open时的用户组分配

fork()的参数形式

fork()
// 可以不写参数,只是注意要拿到返回值

read

read(fd, buffer, length); fd文件描述符,buffer缓存,length 长度, 从某个文件中读取一段

write也是同理,这里不赘述了

2. 结构

sequenceDiagram pipe[0] -->> pipe[1]: 写入消息 pipe[1] -->> pipe[0]: 读出消息

在pipe[1]读之前,一定会确保写入成功.

3. pipe函数

pipe(int pipefd[2]);
// 将这个数组内部的两个指 变化为两个虚拟的文件
// 也就是两个虚拟的fd,但是pipefd[0]的读出将与pipefd[1]的读出绑定起来

4. 代码实现

#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>

int main(int args, char *argv[]) {
        if (args != 3) {
                fprintf(stderr, "<Usage> ./writer filein fileOut\n");
                exit(EXIT_FAILURE);
        }

        int pipefd[2];

        if (pipe(pipefd) < 0) {
                fprintf(stderr, "初始化通道失败\n");
                exit(EXIT_FAILURE);
        }

        int child1, child2;
        child1 = fork();
        if (child1 != 0) {
                child2 = fork();
        }

        if (child1 == 0) {
                int fd = open(argv[1], O_RDWR);
                char p[1];
                while (read(fd, p, 1) > 0) {
                        write(pipefd[1], p, 1);
                }
        }
        if (child2 == 0) {
                int fd = open(argv[2], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
                char p[1];
                while (read(pipefd[0], p, 1) > 0) {
                        write(fd, p, 1);
                }
        }
}

5. 演示

image

posted @ 2022-11-01 21:27  MushRain  阅读(62)  评论(0编辑  收藏  举报