dup
#include <unistd.h>
int dup(int oldfd);
作用: 复制一个新的文件描述符,指向同一个文件,
从空闲的文件描述符表中找一个最小的作为新文件描述符
参数:
- oldfd 旧的文件描述符
返回:
新描述符
-1 错误
实例: 复制一个文件描述符,并且为所指向的文件写入数据
dup.c
#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, char const *argv[])
{
int fd = open("dup.txt", O_RDWR | O_CREAT, 0664);
int fd1 = dup(fd);
if (fd == -1)
{
perror("dup err");
return -1;
}
printf("fd : %d, fd1 : %d\n", fd, fd1);
close(fd);
char *str = "hello world";
int ret = write(fd1, str, strlen(str));
if (ret == -1)
{
perror("write err");
return -1;
}
close(fd1);
return 0;
}
dup2
#include <unistd.h>
int dup2(int oldfd, int newfd);
作用: 重定向文件描述符
例如 oldfd 指向 a.txt, newfd 指向 b.txt
调用函数成功后, newfd 的 b.txt 做 close, newfd指向了a.txt;
oldfd 必须是一个有效的文件描述符
如果 oldfd 和 newfd 值相同,相当于什么都没有做
返回: 与newfd相同的新文件描述符
实例:
dup2.c
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char const *argv[])
{
//创建dup2.txt
int fd = open("dup2.txt", O_RDWR | O_CREAT, 0664);
if (fd == -1)
{
perror("open err");
return -1;
}
//创建dup3.txt
int fd1 = open("dup3.txt", O_RDWR | O_CREAT, 0664);
if (fd1 == -1)
{
perror("open err");
return -1;
}
printf("fd : %d, fd1 : %d\n", fd, fd1);
// fd1不再指向dup3.txt, 而是指向和fd的同一个文件dup2.txt
int fd2 = dup2(fd, fd1);
if (fd2 == -1)
{
perror("dup2 err");
return -1;
}
//通过fd1 去写数据
char *str = "hello, dup2";
int len = write(fd1, str, strlen(str));
if (len == -1)
{
perror("write err");
return -1;
}
printf("fd : %d, fd1 : %d, fd2 : %d\n", fd, fd1, fd2);
// fd : 3, fd1 : 4
// fd : 3, fd1 : 4, fd2 : 4
close(fd);
close(fd1);
return 0;
}
标签:md,txt,dup2,int,18,fd1,fd,include
From: https://www.cnblogs.com/anqwjoe/p/16793207.html