微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决C 用 fork() 写入后关闭 FDT?

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

@Echo Off
SetLocal EnableExtensions disableDelayedExpansion
<"input.txt" (
    Set /P "#1="
    Set /P "#2="
    SetLocal EnableDelayedExpansion
    Set /P "=!#1!"<NUL & Echo(
    Set /P "=!#2!"<NUL & Echo(
    EndLocal
    %systemRoot%\System32\more.com +4
) >"output.txt"

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

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

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

解决方法

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

但我认为您的争议实际上是关于所有 duping 和 forking 的影响。假设此代码片段中的所有函数调用都成功(并且您确实应该测试它,尤其是因为它可以解决您的争议)...

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

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。