两个不同的文件,但相同的描述符?

时间:2014-04-18 10:56:50

标签: c file-descriptor

我有几个节目。我运行主程序/进程A.它创建了两个管道。当我打印这些描述符时,我有第3和第4个描述符用于管道1,而5和6用于管道2。然后程序A创建两个新进程B(B.cpp)和C(C.cpp)(使用fork()然后执行execv())并且我将它们作为参数第二个描述符(管道一(4))和每个新进程进程我打开不同的文件(对于B文件b.txt和C c.txt)。当我再次打印描述符时,打开的文件b.txt和c.txt有相同的描述符。我使用了sleep(2)函数,因此所有进程都处于活动状态。这怎么可能?难道不是B和C的描述符不同吗?

B:

#define FILENAME1 "b.txt"
static int des1;
static int des2;
....
des1 = open(FILENAME1, O_RDONLY);  
if(tempDes == -1){
  perror("Open");
  exit(EXIT_FAILURE);
}
printf("descriptors1: %d, %d\n", des1, des2);
....

C:

#define FILENAME2 "c.txt"
static int des1;
static int des2;
....
des1 = open(FILENAME2, O_RDONLY);  
if(tempDes == -1){
  perror("Open");
  exit(EXIT_FAILURE);
}
printf("descriptors2: %d, %d\n", des1, des2);
....

控制台输出: enter image description here

在b.txt中:

sometexta
sometextb
...

在c.txt中:

one
two
...

1 个答案:

答案 0 :(得分:0)

内核维护一个文件描述符的每进程表。

否则多用户多进程系统甚至无法工作,因为所有进程的STDIN,STDOUT和STDERR文件描述符(0,1,2)必须指向同一个文件(终端),但它们显然是使用独立终端。

另一方面,当你fork时,子进程从父进程继承所有打开的文件描述符,并且它们指向同一个物理文件。但是在fork之后打开的文件是独立的。