Linux系统编程-文件-dup

97 阅读2分钟

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