千家信息网

unix 父子进程间通信-无名管道

发表于:2025-02-11 作者:千家信息网编辑
千家信息网最后更新 2025年02月11日,#include #include #include #include #include #include #include #define MAXLINE 100char buf[MAX
千家信息网最后更新 2025年02月11日unix 父子进程间通信-无名管道
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. #include <sys/types.h>
  7. #include <sys/wait.h>
  8. #define MAXLINE 100
  9. char buf[MAXLINE];
  10. int main(int argc, char** agrv)
  11. {
  12. int pipefd[2];
  13. int ret;
  14. if(0 != pipe(pipefd))//创建管道
  15. {
  16. perror("pipe\n");
  17. exit(1);
  18. }
  19. //创建子程序
  20. if((ret=fork()) < 0)//创建失败
  21. {
  22. perror("fork\n");
  23. exit(1);
  24. }
  25. else if(ret == 0)//子程序
  26. {
  27. FILE* fp;
  28. close(pipefd[0]);//关闭管道可读端
  29. fp = fopen("./main.c","r"); //打开已存在可读文件
  30. if(NULL == fp)
  31. {
  32. perror("fopen\n");
  33. exit(1);
  34. }
  35. while(fgets(buf,MAXLINE,fp) != NULL)//将文件内容全部读入管道
  36. {
  37. int n = strlen(buf);
  38. if(n != write(pipefd[1],buf,n))
  39. {
  40. perror("write\n");
  41. exit(1);
  42. }
  43. }//end while
  44. if(ferror(fp))//在读的过程文件是否有报错
  45. {
  46. perror("ferror\n");
  47. exit(1);
  48. }
  49. close(pipefd[1]);//关闭文件可写端
  50. exit(0);//退出子程序
  51. }
  52. else
  53. {
  54. close(pipefd[1]);//关闭管道可写端
  55. if(-1 == wait(NULL))//等待子程序完全将文件内容读入到管道
  56. {
  57. perror("wait\n");
  58. exit(1);
  59. }
  60. if(dup2(pipefd[0],STDIN_FILENO) != STDIN_FILENO)//重新设置标准输入为管道可读端
  61. {
  62. perror("dup2\n");
  63. exit(1);
  64. }
  65. if(execl("/bin/more","more",(char*)0) < 0 )//分页程序 自动调用标准输入文件 显示管道内容
  66. {
  67. perror("execl\n");
  68. exit(1);
  69. }
  70. }
  71. return 0;
  72. }
0