- 浏览: 141069 次
文章分类
最新评论
复制文件描述符常用的地方就是在重定向中。下面两个函数都可以用来复制一个现有文件描述符。
由 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 使用,它允许使用路径名作为调用参数的程序,能用处理其他路径名的相同方式处理标准输入和输出。
#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 使用,它允许使用路径名作为调用参数的程序,能用处理其他路径名的相同方式处理标准输入和输出。
发表评论
-
打开伪终端设备
2018-07-09 20:50 1249在伪终端概述一节中已对 PTY进行了初步的介绍。尽管 ... -
伪终端概述
2018-06-02 11:05 1535伪终端就是指,一个应用程序看上去像一个终端,但事实上它 ... -
终端窗口大小和 termcap
2018-05-29 22:39 791多数 UNIX 系统都提供了一种跟踪当前终端窗口大小的 ... -
终端规范模式和非规范模式
2018-05-29 00:25 944终端规范模式很简单:发一个读请求,当一行已经输入后,终 ... -
终端标识
2018-05-23 11:18 566尽管控制终端的名字在多数 UNIX 系统上都是 /de ... -
波特率和行控制函数
2018-05-22 07:53 935虽然大多数终端设 ... -
终端属性和选项标志
2018-05-20 07:40 707tcgetattr 和 tcsetattr ... -
终端特殊输入字符
2018-05-17 06:33 810终端支持下表所示的特殊输入字符。 为了更改 ... -
终端 I/O 综述
2018-05-10 07:56 433终端设备可认为是由内核中的终端驱动程序控制的。每个终端 ... -
POSIX 信号量
2018-05-09 00:03 575在XSI IPC通信之信 ... -
XSI IPC 通信之共享存储
2018-04-25 07:18 943在XSI IPC通信之消息队列和XSI IPC通信之信 ... -
XSI IPC通信之信号量
2018-04-17 23:38 612在XSI IPC通信之消 ... -
XSI IPC通信之消息队列
2018-04-15 10:54 490消息队列是消息的链接表,存储在内核中,由消息队列标识符 ... -
XSI IPC 相似特征介绍
2018-02-08 23:48 480有 3 种称作 XSI IPC ... -
IPC 通信之 FIFO
2018-02-06 22:55 413FIFO 也被称为命名管道,未命名的管道只能在两个相关 ... -
IPC 通信之管道
2018-01-30 22:22 383管道是 UNIX 系统 IPC 的最古老但也是最常用的 ... -
readv/writev 函数及存储映射 I/O
2018-01-19 00:57 879readv 和 writev 函数可用于在一次函数调用 ... -
POSIX 异步 I/O
2018-01-16 21:33 451POSIX 异步 I/O 接口为对不同类型的文件进行异 ... -
fcntl 记录锁
2018-01-06 23:48 588记录锁的功能是:当有进程正在读或修改文件的某个部分时, ... -
守护进程惯例
2018-01-06 23:52 433UNIX 系统中,守护进程遵循下列通用惯例。 ...
相关推荐
fcntl函数复制文件描述符,此例只是用来留作笔记,
5. **复制文件描述符**:`dup()`和`dup2()`函数可以创建文件描述符的副本,使得多个描述符指向同一文件,这对于实现进程间的通信和共享打开的资源非常有用。 在实际编程中,文件描述符广泛应用于各种场景,如网络...
`dup()`函数是Linux提供的一个系统调用,它的主要作用是创建一个新的文件描述符,该描述符与已存在的一个文件描述符指向相同的内核文件表项。这样,新旧两个描述符都可以进行读写操作,且对其中一个所做的修改会影响...
- **实现方式**:文件描述符的传输通常是通过`sendmsg()`和`recvmsg()`函数完成的,这两个函数允许在消息中携带文件描述符。为了支持这一特性,消息中会包含一个额外的`msghdr`结构体,其中包含了`msg_control`字段...
在这个过程中,通常会使用`socketpair()`或`pipe()`函数创建一对具有关联文件描述符的文件描述符,这两个文件描述符在同一进程中可以读写。然后,通过某种IPC机制(如`sendmsg()`、`recvmsg()`或`fork()`+`dup2()`)...
**示例**:如果 `newfd` 的值为 1,那么 `dup2` 函数将把 `oldfd` 的文件描述符复制到 1。如果 1 已经被使用,则先关闭再复制。 ##### 3.3 实现机制 `dup` 和 `dup2` 函数可以通过 `fcntl` 函数实现相同的功能。...
在Linux下,进程间传递描述符是一种高级的IPC形式,它允许一个进程向另一个进程传递已经打开的文件描述符。这种方式允许进程间共享文件、管道、套接字等资源,而无需复制数据本身。 首先,理解文件描述符是操作系统...
2. **注册事件**:使用`epoll_ctl()`函数向`epoll`实例中添加或修改文件描述符的事件类型,如`EPOLLIN`(表示可读)、`EPOLLOUT`(表示可写)等。 3. **等待事件**:调用`epoll_wait()`函数阻塞,直到有注册的文件...
在成功打开文件后,open()函数会返回一个文件描述符。 - `buf`:指向内存缓冲区的指针,读取的数据将存储在这里。 - `count`:欲读取的字节数。 当read()函数成功执行时,它会将文件中的数据复制到指定的缓冲区,并...
转换通常通过`Copy()`或`CopyTo()`函数完成,这些函数会复制源描述符的内容到目标描述符,并根据需要进行类型转换。 3. **浮点形式转化为TBUF** 在文件“浮点形式转化为TBUF.doc”中,可能涉及到如何将浮点数转换...
该函数的使用可以分为五个方面:复制文件描述符、获取和设置文件描述符标记、获取和设置文件状态标记、获取和设置异步 I/O 所有权、获取和设置记录锁。 1. 复制文件描述符 fcntl 函数可以用来复制一个现有的文件...
文件描述符在Linux中用于标识打开的文件,`dup`和`dup2`函数则用于复制或重定向文件描述符。`dup`返回一个新的、未使用的文件描述符,指向与旧文件描述符相同的文件。`dup2`允许指定目标文件描述符,将旧文件描述符...
标题和描述中提到的知识点有C语言中的文件处理、文件结束标志EOF、FEOF函数以及文档编码的处理。在C语言中,文件的输入输出是程序设计中一个较为复杂的部分,涉及到数据流的概念以及文件指针的使用。文件结束标志EOF...
通过调用`fcntl`函数,用户可以实现多种不同的功能,如复制文件描述符、获取或设置文件描述符标志等。下面将详细介绍`fcntl`函数的功能以及使用方法。 #### 函数原型 ```c #include int fcntl(int fd, int cmd, ....
这个函数在创建文件时会以只写方式打开,并返回文件描述符,若失败则返回-1。`mode`参数可以结合各种访问权限标志,如`S_IRUSR`、`S_IWUSR`、`S_IXUSR`等,用于设定文件所有者的读、写、执行权限。 2. `open`函数是...
`dup2()` 函数用于复制一个文件描述符 `oldfd` 到另一个文件描述符 `newfd`。如果 `newfd` 已经被打开,则会先关闭 `newfd`。 **返回值:** - 成功时返回最小且尚未使用的文件描述符。 - 发生错误时返回 -1,并设置...
文件描述符复制 - `F_DUPFD` 命令 `F_DUPFD` 用于复制一个文件描述符,这在某些场景下非常有用,比如当需要创建一个新进程时,原进程的文件描述符可以通过复制的方式传递给新进程。 **示例代码**: ```c int new_...