【发布时间】:2014-04-18 10:56:50
【问题描述】:
我有几个程序。我运行主程序/进程 A。它创建了两个管道。当我打印这些描述符时,管道一的描述符为 3 和 4,管道二的描述符为 5 和 6。然后程序 A 创建两个新进程 B(B.cpp) 和 C(C.cpp)(使用 fork() 和 execv()),我将它们作为管道 one(4) 的参数第二个描述符和每个新的过程我打开不同的文件(对于 B 文件 b.txt 和对于 C c.txt)。当我再次打印描述符时,打开的文件 b.txt 和 c.txt 有相同的描述符。我使用了sleep(2) 函数,所以所有进程都处于活动状态。这怎么可能? B和C的描述符不应该不同吗?
乙:
#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
...
【问题讨论】:
-
为什么它们会不同?
-
你从来没有在上面分配任何东西给
des2。此外,您的输出与代码不匹配。介意发布实际代码吗? -
如果一个进程当前打开了文件,并且您打开了一个文件,您通常希望新的文件描述符是最低的未使用值。兄弟进程可能在做什么完全无关紧要。
-
des2 从参数中获得了值,其中 ... 是一些代码,但它并不重要
-
不,每个进程都有自己的文件描述符表,它们通常从 3 - 开始(0、1 和 2 分别用于标准输入、标准输出和标准错误)。它们在流程中是独一无二的,而不是全球性的——正如我理解你的问题。
标签: c file-descriptor