dup()和dup2()

  dup和dup2函数都是复制文件描述符的函数,其会将目标文件描述符的文件表项复制给一个其他的文件描述符。

  简而言之,dup等函数可以一个已经打开的文件描述符表项复制给另一个文件描述符中,即可以通过两个不同的文件描述符来操控同一个文件。

  函数形式:

  int dup(int oldfd);成功返回目标文件的描述符,失败则返回-1.如int fd2 = dup(fd); fd2则会得到一个新的文件描述符,而且可以和fd一起操控同一个文件。

  在使用之后也需要将两个文件描述符关闭:

  close(fd);
  close(fd2);

 int dup2(int oldfd, int newfd); 成功则返回目标文件描述符,失败返回-1.oldfd 为源文件的描述符, newfd为目标文件描述符。其在运行时,会先检查newfd是否存在,如果存在,则会先关闭newfd,后将其复制给后者。如果空闲,则直接复制。

  实例代码如下:

  

#include 
#include 
#include 
#include 
int main(void) {int fd1 = open("dup.txt", O_RDWR | O_CREAT |O_TRUNC, 0644);if (fd1 == -1) {perror("open");return -1;}printf("fd1 = %d\n", fd1);int fd2 = dup(fd1);if (fd2 == -1) {perror("dup");return -1;}printf("fd2 = %d\n", fd2);int fd3 = dup2(fd2, 100);if (fd3 == -1) {perror("dup2");return -1;}printf("fd3 = %d\n", fd3);const char* text = "Hello, World!";if (write(fd1, text, strlen(text) * sizeof(text[0])) == -1) {perror("write");return -1;}if (lseek(fd2, -6, SEEK_CUR) == -1) {perror("lseek");return -1;}text = "Linux";if (write(fd3, text, strlen(text) * sizeof(text[0])) == -1) {perror("write");return -1;}close(fd3);close(fd2);close(fd1);return 0;
}

  


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部