复制文件句柄dup2 函数

函数简介  

函数名: dup2

功 能: 复制文件句柄
用 法: int dup2(int oldhandle, int newhandle);
#include <sys\stat.h>
  #include <string.h>
  #include <fcntl.h>
  #include <io.h>
  int main(void)
  {
  #define STDOUT 1
  int nul, oldstdout;
  char msg[] = "This is a test";
  /* create a file */
  nul = open("DUMMY.FIL", O_CREAT | O_RDWR,
  S_IREAD | S_IWRITE);
  /* create a duplicate handle for standard
  output */
  oldstdout = dup(STDOUT);
  /*
  redirect standard output to DUMMY.FIL
  by duplicating the file handle onto the
  file handle for standard output.
  */
  dup2(nul, STDOUT);
  /* close the handle for DUMMY.FIL */
  close(nul);
  /* will be redirected into DUMMY.FIL */
  write(STDOUT, msg, strlen(msg));
  /* restore original standard output
  handle */
  dup2(oldstdout, STDOUT);
  /* close duplicate handle for STDOUT */
  close(oldstdout);
  return 0;
  } 


  
### 如何在 Linux 中保留文件句柄不关闭文件描述符 在 Linux 系统中,当通过 `fork` 创建子进程时,默认情况下父子进程会共享打开的文件描述符。这意味着如果父进程打开了某个文件,在创建子进程之后,该文件也会保持打开状态,并且两个进程可以独立操作这个文件[^1]。 为了确保某些特定的文件描述符不会因为其他原因而意外关闭,可以通过设置文件描述符标志来实现这一点。具体做法是在调用 `open()` 或者 `dup2()` 函数获取到文件描述符后立即使用 `fcntl()` 来修改其属性,特别是清除 `FD_CLOEXEC` 标志位。这样即使执行了 `execve()` 类型的系统调用来加载新程序也不会自动关闭这些文件描述符[^3]。 下面是具体的代码示例: ```c #include <unistd.h> #include <fcntl.h> int main(){ int fd; // 打开文件并获得文件描述符 fd = open("example.txt", O_RDWR); if (fd >= 0){ // 清除 FD_CLOEXEC 标记以防止 exec 后关闭此文件描述符 fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) & ~FD_CLOEXEC); pid_t child_pid = fork(); if(child_pid == 0){ // 子进程中继续使用相同的文件描述符而不必重新打开它 execlp("/bin/cat", "cat", NULL); // 这里假设 cat 命令能够读取已有的文件描述符 _exit(EXIT_FAILURE); } wait(NULL); close(fd); } return 0; } ``` 在这个例子中,`fcntl()` 被用于移除了默认添加给所有新建文件描述符上的 `FD_CLOEXEC` 标识。这使得即便后续发生了 `execlp()` 的调用,指定的文件描述符仍然会被保留下来供新的可执行映像继承和使用[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值