[Linux管道和IPC]管道的实际应用2

发布时间:2020-08-03 14:47:28 作者:银河星君
来源:网络 阅读:346
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <limits.h>
#include <string.h>
#include <sys/wait.h>
#include <error.h>

#define DEF_PAGER "/bin/more"   //定义处理函数
#define MAXLINE  4096   //行最大字符数

int main(int argc, char *argv[])
{
  int     n;
  int     fd[2];
  pid_t   pid;
  char    *pager, *argv0;
  char    line[MAXLINE];
  FILE    *fp;
  if (argc != 2)  //如果参数不正确
  {
    printf("请输入正确的命令:<pathname>\n");
    exit(1);
  }
  if ((fp = fopen(argv[1], "r")) == NULL)  //如果以只读打开argv[1]指向的文件出错
  {
    printf("不能打开文件%s", argv[1]);
    exit(1);
  }
  if (pipe(fd) < 0)  //创建管道失败
  {
    printf("创建管道失败\n");
    exit(0);
  }
  if ((pid = fork()) < 0)  //创建子进程失败
  {
    printf("创建子进程失败\n");
    exit(0);
  }
  else if (pid > 0)
  {                               //父进程
    close(fd[0]);           //关闭读文件描述符
    //将argv[1]通过管道发送
    while (fgets(line, MAXLINE, fp) != NULL)
    {
      n = strlen(line);
      if (write(fd[1], line, n) != n)
      {
        printf("写管道失败\n");
        exit(1);
      }
    }
    if (ferror(fp))  //如果文件描述符出错
    {
        printf("fgets 失败\n");
        exit(1);
    }
    close(fd[1]);   //
    if (waitpid(pid, NULL, 0) < 0)
    {
        printf("waitpid失败\n");
        exit(1);
    }
    exit(0);
  }
  else  //子进程
  {
    close(fd[1]);
    if (fd[0] != STDIN_FILENO)
    {
      if (dup2(fd[0], STDIN_FILENO) != STDIN_FILENO)
      {
        printf("dup2到标准输入失败\n");
        exit(1);
      }
      close(fd[0]);   /* don't need this after dup2 */
    }
    //exec函数的参数
    if ((pager = getenv("PAGER")) == NULL)
    {
      pager = DEF_PAGER;
    }
    if ((argv0 = strrchr(pager, '/')) != NULL)
    {
      argv0++;
    }
    else
    {
      argv0 = pager;
    }
    if (execl(pager, argv0, (char *)0) < 0)
    {
      printf("调用execl失败%s", pager);
      exit(1);
    }
  }
  exit(0);
}


推荐阅读:
  1. [Linux管道和IPC]消息队列接收服务器端
  2. [Linux管道和IPC]消息队列发送客户端

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

linux管道 inux

上一篇:在Oracle12.1中使用NID 修改数据库的DBID和DBName【实战】

下一篇:Apache - AH00436

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》