Linux提供的高级IO函数, 自然是特定条件下能力更强, 不然要他干啥, 特定条件自然限制了他的使用频率 文件描述符 文件描述符在是一个非负整数。是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。 STDOUT_FILENO(值为1)- 值为1的文件描述符为标准输出, 关闭STDOUT_FILENO后用dup即可返回最小可用值(目前为, 1) 这样输出就重定向到了调用dup的参数指向的文件
创建文件描述符 - pipe dup dup2 splice select
pipe函数 这个函数可用于创建一个管道, 实现进程间的通信.
// 函数定义 // 参数文件描述符数组 fd[0] 读出 fd[1]写入 单向管道 // 成功返回0, 并将一对打开的文件描述符填入其参数指向的数组 // 失败返回-1 errno #include <unistd.h> int pipe(int fd[2]);
// 双向管道 // 第一个参数为 协议PF_UNIX(书上是AF_UNIX)感觉这里指明协议使用PF更好一些 #include <sys/types.h> #include <sys/socket.h> int socketpair(int domain, int type, int protocol, int fd[2]);
学习了后面的内容了解到了进程间通信, 回来补上一个例子
int main() { int fds[2]; socketpair(PF_UNIX, SOCK_STREAM, 0, fds); int pid = fork(); if (pid == 0) { close(fds[0]); char a[] = "123"; send(fds[1], a, strlen(a), 0); } else if (pid > 0) { close(fds[1]); char b[20] {}; recv(fds[0], b, 20, 0); printf("%s", b); } }
dup和dup2函数 复制一个现有的文件描述符
#include <unistd.h> // 返回的文件描述符总是取系统当前可用的最小整数值 int dup(int oldfd); // 可以用newfd来制定新的文件描述符, 如果newfd已经被打开则先关闭 // 如果newfd==oldfd 则不关闭newfd直接返回 int dup2(int oldfd, int newfd);
dup函数创建一个新的文件描述符, 新的文件描述符和原有的file_descriptor共同指向相同的目标. 回来补上例子, 这个例子由于关掉了STDOUT_FILENO
dup最小的即为STDOUT_FILENO
所以 标准输出都到了这个文件之中
int main() { int filefd = open("/home/lsmg/1.txt", O_WRONLY); close(STDOUT_FILENO); dup(filefd); printf("123\n"); exit(0); }