c - 在一个进程 fork 并且我们有一个新的克隆进程之后,关闭子表中的文件会影响父表中的表吗?

标签 c operating-system filesystems fork file-descriptor

给定 进程 A 和一个文件描述符。处理 A forks() 并创建其自身的克隆。我们称它为进程 B。现在,每个进程 A 和 B 都有自己的描述符。但是,更改子项中的值不会影响父项中的值。因此,举例来说,我在 child 中调用 close(3), child 最初在创建时具有与 parent 相同的值。但是现在如果父进程仍然假设文件是​​打开的(因为在父进程和子进程的描述符表中发生的事情是分离的),这不会引起冲突吗? parent 不会仍然认为文件是打开的吗?

最佳答案

当文件描述符在 fork 期间被继承时,关闭父级中的描述符对子级中相应的描述符没有影响,反之亦然。

下面是 pipe 手册页中的一个示例,正是这样做的:

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

   int main(int argc, char *argv[])
   {
       int pfd[2];
       pid_t cpid;
       char buf;

       assert(argc == 2);

       if (pipe(pfd) == -1) { perror("pipe"); exit(EXIT_FAILURE); }

       cpid = fork();
       if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); }

       if (cpid == 0) {    /* Child reads from pipe */
           close(pfd[1]);          /* Close unused write end */

           while (read(pfd[0], &buf, 1) > 0)
               write(STDOUT_FILENO, &buf, 1);

           write(STDOUT_FILENO, "\n", 1);
           close(pfd[0]);
           _exit(EXIT_SUCCESS);

       } else {            /* Parent writes argv[1] to pipe */
           close(pfd[0]);          /* Close unused read end */
           write(pfd[1], argv[1], strlen(argv[1]));
           close(pfd[1]);          /* Reader will see EOF */
           wait(NULL);             /* Wait for child */
           exit(EXIT_SUCCESS);
       }
   }

关于c - 在一个进程 fork 并且我们有一个新的克隆进程之后,关闭子表中的文件会影响父表中的表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33382200/

相关文章:

C编程: String manipulation

c# - 跟踪正在移动的文件(可能在磁盘之间),VB.NET(或C#)的最佳方法

c - 使用 mmap 写入文件的原子性?

c - 程序有时会出现段错误,但并非总是如此。我该如何纠正它?

c - 并行演示程序

c - 通过 C 代码使用 ssh

performance - 虚拟内存在当今廉价 RAM 的世界中仍然重要吗?

c++ - 如何在我的操作系统内核中启用 IRQ8?

c - 子进程是否执行这两个打印?

tags - 在 PC 和 Mac 上为图像使用标签或元数据