关于文件中fork的用法

fork的知识之一

涉及到的小知识
(每个程序(进程)都有一个文件描述符表,该表的值是从0开始,按序号依次前三个文件描述符系统默认给出:0.stdin 1.stdout 2.stderr 在这个程序(进程)中,每打开一个文件,就有一个文件描述符与之相对应,涉及到相同的文件可能被不同的程序打开,因此不同的文件描述符可以指向同一个文件)

一,先打开再复制

如图,父进程先打开文件,再fork,子进程也指向相同的文件,此时文件struct file的引用次数count为2,当引用次数为0时,文件节点才能关闭,才能省出位置,先打开再复制时,他们也公用文件偏移量(每打开一次向后移一次),所以父子并发打印文件的东西,而当文件偏移量没来得及更改时,可能会发生父子打印相同的,但是他们两是并发执行的。

所以需要父子都close(偏移量也共享)

当父进程close之后,子进程还可以继续访问,两个互不影响,因为count引用次数为2.

一般父进程先close,剩下的操作让子进程去操作,然后close!
代码:

#include

#include

#include   //Linux是根据Unix编写的,沿袭的一些标准库unix std

#include

#include

 

int main()

{
     
         int fd = open ("file.txt", O_RDONLY);

         assert( fd != -1);

         pid_t pid = fork();             //子进程返回0, 父进程返回>0
          assert( pid != -1);

         

            if( pid == 0)

          {
     
                char buff[128] = {
     0};
                read (fd, buff,1 );

                printf("child: %s\n", buff);

                 sleep(1);

                 read(fd, buff, 1);

                 printf("child: %s\n", buff);

              }

               else      

             {
     
                char buff[128] = {
     0};
                read (fd, buff,1 );

                printf("parent: %s\n", buff);

                 sleep(1);

                 read(fd, buff, 1);

                 printf("parent: %s\n", buff);

              }

                close( fd ); 

}

 

二,先复制再打开

先复制再打开文件时,父进程会先复制文件表前三行内容,然后父进程与子进程分别指向不同的struct file,互不影响,不共享。close时各自close各自的,各自的count都为1,而文件偏移量相同,所以输出的东西也一样。

!
代码:

int main()

{
     

         pid_t pid = fork();             //子进程返回0, 父进程返回>0
          assert( pid != -1);

         

         int fd = open ("file.txt", O_RDONLY);

         assert( fd != -1);


            if( pid == 0)

          {
     
                char buff[128] = {
     0};
                read (fd, buff,1 );

                printf("child: %s\n", buff);

                 sleep(1);

                 read(fd, buff, 1);

                 printf("child: %s\n", buff);

              }

               else      

             {
     
                char buff[128] = {
     0};
                read (fd, buff,1 );

                printf("parent: %s\n", buff);

                 sleep(1);

                 read(fd, buff, 1);

                 printf("parent: %s\n", buff);

              }

                close( fd ); 

}

你可能感兴趣的:(笔记,linux)