`

文件描述符复制函数

阅读更多
    复制文件描述符常用的地方就是在重定向中。下面两个函数都可以用来复制一个现有文件描述符。
#include <unistd.h>

int dup(int fd);
int dup2(int fd, int fd2);
            /* 两函数的返回值:若成功,返回新的文件描述符;否则,返回 -1 */

    由 dup 函数返回的新文件描述符一定是当前可用文件描述符中的最小数值。对于 dup2 函数,可以用 fd2 参数指定新描述符的值。如果 fd2 已经打开,则先将其关闭。如若 fd 等于 fd2,则返回 fd2,而不关闭它。否则,fd2 的 FD_CLOEXEC 文件描述符标志就被清除,这样 fd2 在进程调用 exec 时是打开状态。
    这些函数返回的新文件描述符与参数 fd 共享同一个文件表项,类似下图所示:

    复制一个描述符的另一种方法是使用 fcntl 函数。实际上,调用
        dup(fd);
    等效于
        fcntl(fd, F_DUPFD, 0);
    而调用
        dup2(fd, fd2);
    等效于
        close(fd2);
        fcntl(fd, F_DUPFD, fd2);
    在后一种情况下,dup2 并不完全等同于 close 加上 fcntl。它们之间的区别具体如下:
    (1) dup2 是一个原子操作,而 close 和 fcntl 却包括了两个函数调用。有可能在close和 fcntl 之间调用了信号捕获函数,它可能修改文件描述符。如果不同的线程改变了文件描述符的话也会出现相同的问题。
    (2) dup2 和 fcntl 有一些不同的 errno。
    另外,较新的系统都提供了名为 /dev/fd 的目录,其目录项是名为 0、1、2 等的文件。打开 /dev/fd/n 等效于复制描述符 n(假定描述符 n 是打开的)。例如下列函数调用:
        fd = open("/dev/fd/0", mode);
    就等效于
        fd = dup(0);
    不过大多数系统都忽略它所制定的 mode,而另外一些系统则要求 mode 必须是所引用的文件初始打开时所使用的打开模式的一个子集(Linux 中的 /dev/fd 是个例外。其中的描述符是指向底层物理文件的符号链接。例如,打开 /dev/fd/0 实际上正在打开与标准输入关联的文件,因此返回的新文件描述符的模式与 /dev/fd 文件描述符的模式其实并不相关)。
    还有些系统提供路径名 /dev/stdin、/dev/stdout 和 /dev/stderr,这些等效于 /dev/fd/0、/dev/fd/1 和 /dev/fd/2。/dev/fd 中的文件主要由 shell 使用,它允许使用路径名作为调用参数的程序,能用处理其他路径名的相同方式处理标准输入和输出。
  • 大小: 20.5 KB
分享到:
评论

相关推荐

    fcntl函数复制文件描述符

    fcntl函数复制文件描述符,此例只是用来留作笔记,

    文件描述符本质1

    5. **复制文件描述符**:`dup()`和`dup2()`函数可以创建文件描述符的副本,使得多个描述符指向同一文件,这对于实现进程间的通信和共享打开的资源非常有用。 在实际编程中,文件描述符广泛应用于各种场景,如网络...

    文件描述符的复制:dup()和dup2()示例代码

    `dup()`函数是Linux提供的一个系统调用,它的主要作用是创建一个新的文件描述符,该描述符与已存在的一个文件描述符指向相同的内核文件表项。这样,新旧两个描述符都可以进行读写操作,且对其中一个所做的修改会影响...

    经由UNIX域套接字传送文件描述符所涉及的相关知识(自己整理)

    - **实现方式**:文件描述符的传输通常是通过`sendmsg()`和`recvmsg()`函数完成的,这两个函数允许在消息中携带文件描述符。为了支持这一特性,消息中会包含一个额外的`msghdr`结构体,其中包含了`msg_control`字段...

    Linux进程间传递文件描术符事例代码

    在这个过程中,通常会使用`socketpair()`或`pipe()`函数创建一对具有关联文件描述符的文件描述符,这两个文件描述符在同一进程中可以读写。然后,通过某种IPC机制(如`sendmsg()`、`recvmsg()`或`fork()`+`dup2()`)...

    详细介绍dup2函数用法,一看必懂.。。。

    **示例**:如果 `newfd` 的值为 1,那么 `dup2` 函数将把 `oldfd` 的文件描述符复制到 1。如果 1 已经被使用,则先关闭再复制。 ##### 3.3 实现机制 `dup` 和 `dup2` 函数可以通过 `fcntl` 函数实现相同的功能。...

    LINUX进程间传递描述符.pdf

    在Linux下,进程间传递描述符是一种高级的IPC形式,它允许一个进程向另一个进程传递已经打开的文件描述符。这种方式允许进程间共享文件、管道、套接字等资源,而无需复制数据本身。 首先,理解文件描述符是操作系统...

    epoll函数实现多客户端并发

    2. **注册事件**:使用`epoll_ctl()`函数向`epoll`实例中添加或修改文件描述符的事件类型,如`EPOLLIN`(表示可读)、`EPOLLOUT`(表示可写)等。 3. **等待事件**:调用`epoll_wait()`函数阻塞,直到有注册的文件...

    C语言中对文件最基本的读取和写入函数

    在成功打开文件后,open()函数会返回一个文件描述符。 - `buf`:指向内存缓冲区的指针,读取的数据将存储在这里。 - `count`:欲读取的字节数。 当read()函数成功执行时,它会将文件中的数据复制到指定的缓冲区,并...

    symbian各种描述符类型转换

    转换通常通过`Copy()`或`CopyTo()`函数完成,这些函数会复制源描述符的内容到目标描述符,并根据需要进行类型转换。 3. **浮点形式转化为TBUF** 在文件“浮点形式转化为TBUF.doc”中,可能涉及到如何将浮点数转换...

    fcntl使用.doc

    该函数的使用可以分为五个方面:复制文件描述符、获取和设置文件描述符标记、获取和设置文件状态标记、获取和设置异步 I/O 所有权、获取和设置记录锁。 1. 复制文件描述符 fcntl 函数可以用来复制一个现有的文件...

    linux文件介绍,文件使用说明

    文件描述符在Linux中用于标识打开的文件,`dup`和`dup2`函数则用于复制或重定向文件描述符。`dup`返回一个新的、未使用的文件描述符,指向与旧文件描述符相同的文件。`dup2`允许指定目标文件描述符,将旧文件描述符...

    C语言中文件结束符、FEOF函数与文档编码的探讨.pdf

    标题和描述中提到的知识点有C语言中的文件处理、文件结束标志EOF、FEOF函数以及文档编码的处理。在C语言中,文件的输入输出是程序设计中一个较为复杂的部分,涉及到数据流的概念以及文件指针的使用。文件结束标志EOF...

    fcntl函数的功能介绍

    通过调用`fcntl`函数,用户可以实现多种不同的功能,如复制文件描述符、获取或设置文件描述符标志等。下面将详细介绍`fcntl`函数的功能以及使用方法。 #### 函数原型 ```c #include int fcntl(int fd, int cmd, ....

    操作系统实验用C语言编程实现复制文件

    这个函数在创建文件时会以只写方式打开,并返回文件描述符,若失败则返回-1。`mode`参数可以结合各种访问权限标志,如`S_IRUSR`、`S_IWUSR`、`S_IXUSR`等,用于设定文件所有者的读、写、执行权限。 2. `open`函数是...

    09文件操作篇.pdf

    `dup2()` 函数用于复制一个文件描述符 `oldfd` 到另一个文件描述符 `newfd`。如果 `newfd` 已经被打开,则会先关闭 `newfd`。 **返回值:** - 成功时返回最小且尚未使用的文件描述符。 - 发生错误时返回 -1,并设置...

    linux fcntl()函数

    文件描述符复制 - `F_DUPFD` 命令 `F_DUPFD` 用于复制一个文件描述符,这在某些场景下非常有用,比如当需要创建一个新进程时,原进程的文件描述符可以通过复制的方式传递给新进程。 **示例代码**: ```c int new_...

Global site tag (gtag.js) - Google Analytics