C++ UNIX文件描述符重用

C++ UNIX文件描述符重用,c++,c,unix,file-descriptor,C++,C,Unix,File Descriptor,虽然我对UNIX相当熟悉,并且已经在UNIX上编程很长时间了,但我不习惯文件操作 我知道0/1/2文件描述符是标准的输入、输出和错误。我知道,每当一个进程打开一个文件时,它都会得到一个具有最小值的描述符,这个描述符还没有被使用过——我了解使用dup/dup2的一些情况 不过,我对进程之间的文件描述符感到困惑。每个进程是否有自己的0/1/2描述符用于输入/输出/错误,或者这3个描述符是否在所有进程之间共享?为什么您可以在3个不同的shell中运行3个程序,并且如果它们是共享的,那么它们都只能获得程

虽然我对UNIX相当熟悉,并且已经在UNIX上编程很长时间了,但我不习惯文件操作

我知道0/1/2文件描述符是标准的输入、输出和错误。我知道,每当一个进程打开一个文件时,它都会得到一个具有最小值的描述符,这个描述符还没有被使用过——我了解使用dup/dup2的一些情况

不过,我对进程之间的文件描述符感到困惑。每个进程是否有自己的0/1/2描述符用于输入/输出/错误,或者这3个描述符是否在所有进程之间共享?为什么您可以在3个不同的shell中运行3个程序,并且如果它们是共享的,那么它们都只能获得程序输出

如果两个程序在启动后打开myfile.txt,它们都会使用文件描述符#3,还是第二个程序会使用#4,因为使用了3


我知道我问了两个同样的问题,但我只是想说清楚。越详细越好:)我在编程时从来没有遇到过这些问题,但我正在阅读一本UNIX书籍以了解更多内容,我突然意识到这让我很困惑,我以前从未详细考虑过。

每个文件描述符都是进程的本地描述符。但是,某些文件描述符可以引用同一个文件-例如,如果使用
fork()
创建子进程,它将共享父进程打开的文件。它将有自己的一组文件描述符,最初与父级的描述符相同,但它们可以随着关闭/复制等而改变

如果两个程序打开同一个文件,通常它们会得到单独的文件描述符,指向单独的内部结构。但是,使用某些技术(
fork
、FD传递等),可以让不同进程中的文件描述符指向同一内部实体。但一般来说,情况并非如此

回答您的问题,两个程序都会为新打开的文件设置FD#3

Unix中的文件描述符(通常)通过fork()和exec()调用持久化。是的,几个进程可以共享文件描述符

例如,shell可以执行以下命令:

foo | bar

在这种情况下,foo的stdout必须连接到bar的stdin。为此,shell很可能使用pipe()创建读写器文件描述符。有两次。描述符仍然存在。调用foo的fork()将关闭(1);dup(写入程序);使writer_fd描述符为1。然后它将exec(),processfoo将输出到我们创建的管道。对于bar,我们关闭(0);dup(读卡器);然后执行()。瞧,foo将输出到bar。

不要将文件描述符与它们所代表的资源混淆。您可以有十个不同的进程,每个进程的文件描述符为“3”,并且每个进程都引用不同的打开文件。当进程使用其文件描述符执行I/O操作时,操作系统知道哪个进程正在执行I/O操作,并且能够消除引用哪个文件的歧义。

如果在帖子中添加“c”语言标记,您将获得更好的评论。我想我已经见过很多次讨论过这个问题,所以搜索“[c]stdout dup描述符”。祝你好运。谢谢,添加了标签-我也会试着看看其他问题:)进程从不共享描述符。但是,多个文件描述符(在同一进程或不同进程中)可以引用相同的“打开文件描述”,该描述具有诸如当前位置、非阻塞标志等共享属性。