Chinaunix首页 | 论坛 | 博客
  • 博客访问: 534955
  • 博文数量: 181
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1498
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-22 15:17
个人简介

用发呆的时间来理清自己的思绪

文章存档

2015年(7)

2014年(134)

2013年(40)

分类: 嵌入式

2014-06-22 15:41:19

      进程创建时,伴随着父子进程拷贝,处理代码段没有被子进程拷贝以外,子进程几乎拷贝了父进程的所有资源,其中打开的文件表项就是其中之一:程序代码如下:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <errno.h>
  4. #include <stdlib.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <fcntl.h>
  8. #include <unistd.h>

  9. #define N 100

  10. int main(int argc, const char *argv[])
  11. {
  12.     char buf[N] = {0};
  13.     int n = 0;
  14.     int fd = 0;
  15.     pid_t pid = 0;

  16.     if(argc < 2)
  17.     {
  18.         fprintf(stderr,"Usage %s filename.\n",argv[0]);
  19.         exit(EXIT_FAILURE);
  20.     }

  21.     //fork之前先打开文件,父子进程共享文件表项
  22.     if((fd = open(argv[1],O_RDWR)) < 0)
  23.     {
  24.         fprintf(stderr,"Fail to open %s : %s\n",argv[1],strerror(errno));
  25.         exit(EXIT_FAILURE);
  26.     }

  27.     //创建新进程
  28.     if((pid = fork()) < 0)
  29.     {
  30.         perror("Fail to fork");
  31.         exit(EXIT_FAILURE);
  32.     }

  33.     else if(pid >0)//parent
  34.     {
  35.         printf("Father pid is: %d\t",getpid());
  36.         printf("fd = %d\t",fd);

  37.         n = read(fd,buf,sizeof(buf) - 1);//长度减一是为了最后已给字符填充'\0',以便于printf能正常打印输出

  38.         lseek(fd,-n,SEEK_CUR);//当读到n个字符的时候,文件的offset值增加了n,为了从头输出文件内容,所以重写定位。
  39.         buf[n] = '\0';
  40.         printf("read %d : %s",n,buf);

  41.         sleep(1);
  42.     }

  43.     else //child
  44.     {
  45.         printf("child pid is: %d\t",getpid());
  46.         printf("fd = %d\t",fd);

  47.         n = read(fd,buf,sizeof(buf) - 1);
  48.         lseek(fd,-1,SEEK_CUR);
  49.         buf[n] = '\0';

  50.         printf("read %d : %s",n,buf);

  51.     }

  52.     close(fd);

  53.     return 0;
  54. }
运行结果:

点击(此处)折叠或打开

  1. litong@ltubuntu:~/exericse$ ./a.out test.txt
  2. Father pid is: 3121 fd = 3 read 23 : 1234567890abcdefghijkl
  3. child pid  is: 3122 fd = 3 read 23 : 1234567890abcdefghijkl
        由以上结果可以看出,父子进程使用相同的文件表项,在fork之前打开文件,则父子进程使用相同的文件表项,所以,此时父子进程可以分别读取文件中的内容,打印输出结果相同。

阅读(615) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~