我有几个节目。我运行主程序/进程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);
....
控制台输出:
在b.txt中:
sometexta
sometextb
...
在c.txt中:
one
two
...
答案 0 :(得分:0)
内核维护一个文件描述符的每进程表。
否则多用户多进程系统甚至无法工作,因为所有进程的STDIN,STDOUT和STDERR文件描述符(0,1,2)必须指向同一个文件(终端),但它们显然是使用独立终端。
另一方面,当你fork时,子进程从父进程继承所有打开的文件描述符,并且它们指向同一个物理文件。但是在fork之后打开的文件是独立的。