[Linux管道和IPC]管道的實(shí)際應(yīng)用2

#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"   //定義處理函數(shù)
#define MAXLINE  4096   //行最大字符數(shù)

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)  //如果參數(shù)不正確
  {
    printf("請(qǐng)輸入正確的命令:<pathname>\n");
    exit(1);
  }
  if ((fp = fopen(argv[1], "r")) == NULL)  //如果以只讀打開argv[1]指向的文件出錯(cuò)
  {
    printf("不能打開文件%s", argv[1]);
    exit(1);
  }
  if (pipe(fd) < 0)  //創(chuàng)建管道失敗
  {
    printf("創(chuàng)建管道失敗\n");
    exit(0);
  }
  if ((pid = fork()) < 0)  //創(chuàng)建子進(jìn)程失敗
  {
    printf("創(chuàng)建子進(jìn)程失敗\n");
    exit(0);
  }
  else if (pid > 0)
  {                               //父進(jìn)程
    close(fd[0]);           //關(guān)閉讀文件描述符
    //將argv[1]通過管道發(fā)送
    while (fgets(line, MAXLINE, fp) != NULL)
    {
      n = strlen(line);
      if (write(fd[1], line, n) != n)
      {
        printf("寫管道失敗\n");
        exit(1);
      }
    }
    if (ferror(fp))  //如果文件描述符出錯(cuò)
    {
        printf("fgets 失敗\n");
        exit(1);
    }
    close(fd[1]);   //
    if (waitpid(pid, NULL, 0) < 0)
    {
        printf("waitpid失敗\n");
        exit(1);
    }
    exit(0);
  }
  else  //子進(jìn)程
  {
    close(fd[1]);
    if (fd[0] != STDIN_FILENO)
    {
      if (dup2(fd[0], STDIN_FILENO) != STDIN_FILENO)
      {
        printf("dup2到標(biāo)準(zhǔn)輸入失敗\n");
        exit(1);
      }
      close(fd[0]);   /* don't need this after dup2 */
    }
    //exec函數(shù)的參數(shù)
    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("調(diào)用execl失敗%s", pager);
      exit(1);
    }
  }
  exit(0);
}

網(wǎng)頁(yè)題目:[Linux管道和IPC]管道的實(shí)際應(yīng)用2
網(wǎng)站路徑:http://muchs.cn/article12/gdisdc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作App設(shè)計(jì)、網(wǎng)站策劃微信小程序、網(wǎng)站改版、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)