繁体   English   中英

C 用 fork() 写入后关闭 FDT?

[英]C Closing FDT after writing with fork()?

我正在与某人讨论以下代码:

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/file.h>
#include <string.h>

int main() {
// creates a new file having full read/write permissions
    int fd = open("myfile", O_RDWR | O_CREAT, 0666);
    write(fd, "haha\n", 5);
    close(fd); // line 6
    fd = open("myfile", O_RDWR); // line 7
    close(0);
    close(1);
    dup(fd);
    dup(fd);
    if (fork() == 0) {
        char s[100];
        dup(fd);
        scanf("%s", s);
        printf("hello\n");
        write(2, s, strlen(s)); // line 18
    }
    wait(NULL);
    printf("Father finished\n");
    close(fd);
    return 0;
}

他声称我们两次关闭同一个文件会导致错误,但我没有看到。

子进程有自己指向 FDT 的指针,当他关闭其中一个时,他可以毫无问题地关闭其他进程(即使其他进程可能指向同一个 FDT)

另外,这也不会影响父亲。 我错了吗? 你觉得这有什么问题吗?

首先,连续或同时打开同一个文件两次都不是错误。 关闭任何打开的文件描述符也不是错误,无论它引用什么文件。

但我认为你的争论实际上是关于所有dupfork的影响。 假设这个代码片段中的所有 function 调用都成功了(你真的应该测试一下,尤其是因为它会解决你的争议)......

 fd = open("myfile", O_RDWR); // line 7 close(0); close(1); dup(fd); dup(fd);

...您之后拥有三个不同的文件句柄,它们都引用相同的打开文件描述。 关闭其中一个会解除文件描述符与底层打开文件描述的关联,但这不会使其他文件描述符无效,并且当任何文件描述符与之关联时,底层打开文件描述不会关闭。

当该进程成功派生时,新的子进程将获取其自己的独立文件描述符,具有相同的数值,所有这些都与与父进程相同的打开文件描述相关联。 也就是说,当您在第二次dup之后成功分叉时,就会有六个打开的文件描述符,它们都与相同的底层打开文件描述相关联——三个在父级中,三个在子级中。 文件描述符编号在父项和子项中相同的事实是无关紧要的。 文件描述符编号是每个进程的属性。

然后子进程再次dup()的文件描述符fd ,生成(成功时)与打开文件描述相关联的第七个文件描述符。 然后子进程掉出if块的底部并关闭其文件描述符fd 它正常终止,结果所有其他打开的文件描述符也被关闭。

这些都不会直接影响父级,除了父级将从它的wait()中唤醒并继续。 然后它将关闭自己打开的文件描述符,一个显式地关闭,而 rest 在它自己终止时隐式地关闭。

同一个文件描述符没有多次关闭,但同样,如果您担心这一点,那么您可以检查close()的返回值以确定它是否成功完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM