【问题标题】:Two different files but the same descriptor?两个不同的文件但相同的描述符?
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 2012-07-04
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    相关资源
    最近更新 更多