用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);
}
}
}