文件描述符(在C中打开的fd)是否与其进程ID相同?

时间:2014-10-30 12:40:54

标签: c linux file process

在C中使用open()函数时,我得到一个fd(文件描述符)。我想知道它是否与它的进程id相同,因为据我所知,fd是一个整数。

3 个答案:

答案 0 :(得分:7)

不,不是。
PID是进程标识符,文件描述符是文件处理程序标识符。

特别是维基百科关于文件描述符:

  

(...)文件描述符(FD)是用于访问文件的抽象指示符。该术语通常用于POSIX操作系统。

     

在POSIX中,文件描述符是一个整数,特别是C类型int。 (...)

对于PID:

  

[PID]是大多数操作系统内核使用的数字,例如UNIX,Mac OS X或Microsoft Windows,用于临时唯一标识进程(...)

答案 1 :(得分:5)

不,文件描述符是您自己进程的文件表的索引。它们总是整数(也就是说,直到进程的最大打开文件限制),因为除了其他之外,如果select()的位图接口是任意的,它们将不起作用数字。另一方面,PID在回绕之前通常会增长到至少32767。

一般情况下,打开文件不具有自己的进程ID。即使在一个人可能会认为它连接到特定进程的情况下 - 即当文件句柄来自popen()时 - 没有这样的直接连接以及内部内部的内容 popen ()比“将此过程视为文件一样”更复杂。

答案 2 :(得分:4)

没有...

文件描述符是一个不透明的句柄,用于用户空间和内核之间的接口,以识别文件/套接字资源。因此,当您使用open()socket()(系统调用与内核的接口)时,您将返回一个文件描述符,它是一个整数(它实际上是进程u结构的索引 - 但这是不重要)。因此,如果您想直接与内核接口,使用对read()write()close()等系统调用,您使用的句柄就是文件描述符。

PID (即进程标识号)是在类Unix操作系统上创建时自动分配给每个进程的标识号。进程是执行(即,运行)程序的实例。每个进程都保证有一个唯一的PID,它始终是一个非负整数。

UNIX程序员学习的第一件事就是每个正在运行的程序都以三个已打开的文件开头:

描述性名称 ............. fd数字 ................ ...... 说明

 Standard In          0            Input from the keyboard
 Standard Out         1            Output to the console
 Standard Error       2            Error output to the console

如果您创建任何文件描述符,大多数情况下您将获得值3.因为3是最不可用的+ ve整数要为fd分配。由于STDINSTDOUTSTDERR分别占用0,1,2。这就是fd被称为最小非负整数的原因。

相关问题