在一个进程分叉后我们有一个新的克隆进程,将关闭子表中的文件会影响父表中的表吗?

时间:2015-10-28 03:02:07

标签: c operating-system filesystems fork file-descriptor

给出带有文件描述符的进程A 。处理A char c = getch(); if (c == 0) { switch(getch()) { // special KEY_ handling here case KEY_UP: break; } } else { switch(c) { // normal character handling case 'a': break; } } 并创建自己的克隆。我们称之为流程B 。现在,进程A和B中的每一个都有自己的描述符。但是,更改子项中的值不会影响父项中的值。因此,比方说,例如我在孩子中调用forks(),孩子最初在创建父项时具有与父项相同的值。但是现在如果父级仍假定文件是打开的(因为父级和子级描述符表之间发生了分离),这不会导致冲突吗?父母是否仍然认为该文件已打开?

2 个答案:

答案 0 :(得分:1)

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);
       }
   }

答案 1 :(得分:0)

是。它会影响。因为,进程A和进程B都指向该文件描述符的相同文件表条目。如果两个进程都是相同文件表条目的点,则共享文件偏移量和文件状态标志。 如果它是共享的,那么任何一个进程都会关闭该文件,它将影响另一个进程。