文章目录
- dup函数
- dup2函数 重定向
dup函数
#include<unistd.h>
int dup(int oldfd);
功能:
复制oldfd文件描述符,并分配一个新的文件描述符,新的文件描述符是调用进程文件描述符表中最小可用的文件描述符。
参数:
要复制的文件描述符oldfd。
返回值:
成功:新文件描述符。
失败:返回 -1,错误代码存于errno中。
案例代码1:使用dup函数复制文件描述符
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<stdlib.h> #include<sys/stat.h> #include<string.h> #include<fcntl.h> int main() { //通过dup函数复制一个文件描述符 int fd; //dup执行后给返回值文件描述符分配的值是文件描述符表中最小可用的文件描述符 fd = dup(1); printf("fd = %dn",fd); //由于通过dup函数将1这个文件描述符复制了一份为fd,座椅fd现在就相当于1,所以就是向终端写入数据 write(fd,"hello worldn",strlen("hello worldn")); return 0; }
执行结果:
案例代码2:实现输出重定向的功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<stdlib.h> int main() { int fd_file; fd_file = open("file2.txt",O_WRONLY|O_CREAT|O_TRUNC,777); if(fd_file == -1) { perror("fail to openn"); exit(1); } close(1); int fd = dup(fd_file); printf("hello worldn"); printf("fd = %d n",fd); return 0; }
执行结果
注意:
如果需要实现输出重定向的功能,首先向printf函数是操作文件描述符1所对应的文件,默认是操作终端,只要能够把1对应标识的文件改变,就可以实现输出重定向,所以实现创建好文件对应的文件描述符之后,将1文件描述符关闭,接着通过dup函数复制的新的文件描述符就是1,这样printf函数对1操作,就写到了文件中。
dup2函数 重定向
#include<unistd.h>
int dup2(int oldfd,int newfd)
功能:
复制一份打开的文件描述符oldfd,并分配新的文件描述符newfd,newfd也标识oldfd所标识的文件。
注意:
newfd是小于文件描述符最大允许值的非负整数,如果newfd是一个已经打开的文件描述符,则首先关闭该文件,然后再复制。
参数:
**oldfd:**要复制的文件描述符。
**newfd:**分配的新的文件描述符。
返回值:
成功:返回newfd
失败:返回 -1 ,错误代码存于error中
案例代码3: 实现输出重定向
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<stdlib.h> int main() { int fd1; int fd2; fd1 = open("file4.txt",O_CREAT|O_WRONLY,777); if(fd1 < 0) { perror("fail to open n"); exit(1); } //首先关闭1文件描述符,然后将fd1复制给1,意味着1和fd1都标识file4.txt文件,返回值跟1是一样的 fd2 = dup2(fd1,1); printf("hello worldn"); printf("fd2 = %dn",fd2); return 0; }
执行结果:
案例代码4:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30#include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<stdlib.h> #include<fcntl.h> int main() { int fd1; //如果使用dup2,则需要事先给第二个参数对应的变量赋一个初始值】 int fd2=3; //将1复制一份给fd2,所以fd2标识得是标准输出 dup2(1,fd2); printf("fd2 = %dn",fd2); fd1 = open("file.txt",O_CREAT|O_WRONLY|O_TRUNC,777); //输出重定向:关闭文件描述符1,将fd1复制一份为1,所以1此时标识的是file.txt文件 dup2(fd1,1); printf("hello worldn"); //再次实现标准输出:关闭文件描述符1,将fd2复制一份为1,所以1此时标识的是标准输出 dup2(fd2,1); printf("nihao beijingn"); return 0; }
执行结果:
最后
以上就是故意羽毛最近收集整理的关于文件描述符的复制之dup函数和dup2函数dup函数dup2函数 重定向的全部内容,更多相关文件描述符的复制之dup函数和dup2函数dup函数dup2函数内容请搜索靠谱客的其他文章。
发表评论 取消回复