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

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

文章存档

2015年(7)

2014年(134)

2013年(40)

分类: 嵌入式

2014-06-22 17:43:23


点击(此处)折叠或打开

  1. /**************************************************
  2.  * 功能:在fork之前用文件IO打开文件,然后创建子进程
  3.  *      父进程循环从键盘读入数据写入到文件,子进程
  4.  *      循环从文件中读取数据,并且打印到屏幕,如果
  5.  *      父进程输入“quit”,父子进程结束。
  6.  **************************************************/
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <errno.h>
  10. #include <sys/types.h>
  11. #include <sys/stat.h>
  12. #include <fcntl.h>
  13. #include <stdlib.h>

  14. #define N 100

  15. int parent_do(int fd)
  16. {
  17.     char buf[N] = {0};
  18.     int n = 0;

  19.     while(1)
  20.     {
  21.         putchar('>');

  22.         fgets(buf,sizeof(buf),stdin);

  23.         //去掉'\n',注意实际读取的字符个数为strlen(buf)
  24.         //比如输入abc回车,则buf中会读取到'a','b','c','\n'
  25.         //此时存储了字符'\n',需要手动把'\n'替换为'\0'
  26.         buf[strlen(buf) - 1] = '\0';

  27.         //实际写入文件的字符个数为n
  28.         n = write(fd,buf,strlen(buf));

  29.         //注意此次写操作会改变文件表项中的offset值,需要手动把
  30.         //把offset的值设置到文件的开头,以免子进程读取不到字符
  31.         lseek(fd,-n,SEEK_CUR);

  32.         //此时睡眠200ms是为了让子进程执行
  33.         usleep(20000);

  34.         if(strncmp(buf,"quit",4) == 0)
  35.         {
  36.             break;
  37.         }
  38.     }

  39.     return 0;
  40. }

  41. int child_do(int fd)
  42. {
  43.     char buf[N] = {0};
  44.     int n = 0;

  45.     while(1)
  46.     {
  47.         n = read(fd,buf,sizeof(buf));
  48.         buf[n] = '\0';

  49.         if(n == 0)
  50.         {
  51.             continue;
  52.         }

  53.         printf("%s\n",buf);

  54.         if(strncmp(buf,"quit",4) == 0)
  55.         {
  56.             break;
  57.         }
  58.     }

  59.     return 0;
  60. }


  61. int main(int argc, const char *argv[])
  62. {
  63.     int fd = 0;
  64.     pid_t pid = 0;

  65.     if(argc < 2)
  66.     {
  67.         fprintf(stderr,"Usage %s filename",argv[0]);
  68.         exit(EXIT_FAILURE);
  69.     }

  70.     //fork之前打开文件,父子进程共用同一个文件表项(offset)
  71.     if((fd = open(argv[1],O_RDWR | O_CREAT | O_TRUNC,0666)) < 0)
  72.     {
  73.         fprintf(stderr,"Fail to open %s : %s.\n",argv[1],strerror(errno));
  74.         exit(EXIT_FAILURE);
  75.     }

  76.     if((pid = fork()) <0)
  77.     {
  78.         perror("Fail to fork");
  79.         exit(EXIT_FAILURE);
  80.     }
  81.     if(pid > 0)
  82.     {
  83.         parent_do(fd);
  84.     }

  85.     if(pid == 0)
  86.     {
  87.         child_do(fd);
  88.     }

  89.     close(fd);

  90.     return 0;
  91. }
运行结果:

点击(此处)折叠或打开

  1. litong@ltubuntu:~/exericse$ ./a.out test.txt
  2. >ls
  3. ls
  4. >ls
  5. ls
  6. >pwdkjsklfj
  7. pwdkjsklfj
  8. >ksjfsklj
  9. ksjfsklj
  10. >quit
  11. quit
  12. litong@ltubuntu:~/exericse$ cat test.txt
  13. lslspwdkjsklfjksjfskljquitlitong@ltubuntu:~/exericse$
  14. litong@ltubuntu:~/exericse$ cat test.txt
  15. lslspwdkjsklfjksjfskljquitlitong@ltubuntu:~/exericse$ gcc fork_pr_cw.c
  16. litong@ltubuntu:~/exericse$ ./a.out test.txt
  17. >pwd
  18. pwd
  19. >ls
  20. ls
  21. >abcdesqui
  22. abcdesqui
  23. >quit
  24. quit
  25. litong@ltubuntu:~/exericse$
阅读(2090) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~