重定向
- 重定向是什么?
- dup
- dup2
重定向是什么?
进程在最开始运行的时候,首先打开了三个文件,分别是标准输入流、标准输出流、标准错误输出流。证明的时候我是把标准输出留给关闭了,然后紧接着创建的文件就会占用已关闭的标准输出流,使得本该流向显示器的数据流向了新创建的文件。先不谈底层的原理,就只看表象,就像是使数据流的方向从一个方向,指向了另一个方向,完成了数据流的方向重定向。现在再次理解重定向就好理解得多了:重新锚定方向
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_63412763/article/details/127732577
dup
#include <unistd.h>int dup(int fd);
int dup2(int fd1,int fd2);
两个均为复制一个现存的文件的描述。
两个函数的返回:若成功为新的文件描述,若出错为-1;
由dup返回的新文件描述符一定是当前可用文件描述中的最小数值。用dup2则可以用fd2参数指定新的描述符数值。如果fd2已经打开,则先关闭。若fd1=fd2,则dup2返回fd2,而不关闭它。通常使用这两个系统调用来重定向一个打开的文件描述符。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>/** ./dup 1.txt* argc = 2* argv[0] = "./dup"* argv[1] = "file"* ...*/int main(int argc, char **argv)
{char buf[10];char buf2[10];if (argc != 2){printf("Usage: %s <file>\n", argv[0]);return -1;}int fd = open(argv[1], O_RDONLY);int fd2 = open(argv[1], O_RDONLY);int fd3 = dup(fd);printf("fd = %d\n", fd);printf("fd2 = %d\n", fd2);printf("fd3 = %d\n", fd3);if (fd < 0 || fd2 < 0 || fd3 < 0){printf("can not open %s\n", argv[1]);return -1;}read(fd, buf, 1);read(fd2, buf2, 1);printf("data get from fd : %c\n", buf[0]);printf("data get from fd2: %c\n", buf2[0]);read(fd3, buf, 1);printf("data get from fd3: %c\n", buf[0]);return 0;
}
dup2
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>/** ./dup2 1.txt* argc = 2* argv[0] = "./dup2"* argv[1] = "file"* ...
*/int main(int argc,char **argv)
{int fd = 0;if(argc < 2){printf("Usage:%s <file>\n",argv[0]);return -1;}fd = open(argv[1],O_RDWR | O_CREAT | O_TRUNC,0666);if(fd < 0){printf("Can not open %s!\n",argv[1]);printf("errno = %d\n",errno);printf("%s\n",strerror(errno));return -1;}else{printf("fd = %d\n",fd);}dup2(fd,1);printf("hello,world\n");return 0;
}