dup
int dup(int oldfd);
参数:
- oldfd 旧的文件描述符
返回值:
- 新的文件描述符,从最小可用的描述符开始赋值
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc,char* argv[]){
int fd=open(argv[1],O_RDWR); //以可读可写打开文件
int newfd=dup(fd); //用新的文件描述符指向已打开文件
write(newfd,"hello",strlen("hello")); //对新的文件描述符写入,相当于向打开的文件写入
printf("newfd = %d\n",newfd);
close(newfd);
return 0;
}
dup2
dup to
int dup2(int oldfd,int newfd)
参数:
- oldfd 旧的文件描述符
- newfd 新的文件描述符
说明可以自己指定文件描述符
返回值:
- 新的文件描述符
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc,char* argv[]){
int fd1=open(argv[1],O_RDWR);
int fd2=open(argv[2],O_RDWR);
int fdret=dup2(fd1,fd2);
printf("fdret=%d\n",fdret);
int ret=write(fd2,"1234567",strlen("1234567"));
printf("ret=%d\n",ret);
dup2(fd1,STDOUT_FILENO);
//实现重定向的话,就是他会把结果输出到STDOUT_FILENO里面,你把这个文件描述符指向另一个文件就行
//printf就是标准输出,但是标准输出的文件描述符指向了fd1,那么printf会输出到fd1里
printf("----886\n");
}
使用fcntl实现dup
int fcntl(int fd,int cmd,...)
cmd:(就是选模式用的)
- F_DUPFD
参数3:
- 文件描述符
返回值:
- 输入的文件描述符被占用,返回最小可用。
- 输入的文件描述符未被占用,返回>=该值的文件描述符,因为你不能确认执行到这一句的时候是否被占用。
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(int argc,char* argv[]){
int fd1=open(argv[1],O_RDWR); //可读写形式打开文件
printf("fd1 = %d\n",fd1);
int newfd1=fcntl(fd1,F_DUPFD,0); //0被STDIN_FILENO占用,会返回最小可用值
printf("newfd1 = %d\n",newfd1);
int newfd2=fcntl(fd1,F_DUPFD,7); //7没被占用,期望会返回>=7的fd
printf("newfd=%d\n",newfd2);
write(newfd2,"open",strlen("open")); //返回的fd可以使用
return 0;
}