• Linux下C编程,进程通信之标准流管道通信(即系统调用)


    Linux下C编程,进程通信之标准流管道通信(即系统调用)

    1.概述

      在编程的过程中总会需要使用系统调用,如linux下的ps,touch,rm,grep命令等;windows下的dir,mkdir,del命令等。

      在linux中执行系统调用,通常使用标准流管道

      标准流管道将一系列的创建过程合并到一个函数popen()中。poen完成的工作有以下几步:

      (1)创建一个管道。
      (2)fork一个子进程。
      (3)在父子进程中关闭不需要的文件描述符。
      (4)执行exec函数族调用。
      (5)执行函数中所指定的命令。

    2.主要函数说明

      FILE*popen(const char*command,const char*type)

      (1)command:指向的是一个以null结束符结尾的字符串,这个字符串包含一个shell命令,并被送到/bin/sh以-c参数执行,即由shell来执行。如:ps -ef | grep root

      (2)type:“r”,文件指针连接到command的标准输出,即该命令的结果产生输出;“w”:文件指针连接到command的标准输入,即该命令的结果产生输入

      (3)返回值文件描述符。当type='r',可以读取命令的执行结果;当type='w',可以给命令输入参数。

    3.函数使用说明

    3.1执行命令并读取执行结果

    复制代码
    #include<stdio.h>
    #include<unistd.h>
    #include<stdlib.h>
    #include<fcntl.h>
    int main()
    {
        FILE *fp;   ///文件指针
        char buf[1000]; ///缓冲区大小
        if((fp=popen("ps -ef | grep ^rte","r"))==NULL)  ///使用popen()函数,执行shell命令
            return 1;
        while((fgets(buf,1000,fp))!=NULL)   ///根据文件描述符读取命令的输出结果
            printf("%s",buf);
        pclose(fp); ///关闭文件描述符
        exit(0);
        return 0;
    }
    复制代码

    程序输出结果:

     3.2执行命令并输入参数

    复制代码
    #include<stdio.h>
    #include<unistd.h>
    #include<stdlib.h>
    #include<fcntl.h>
    int main()
    {
        FILE *fp;
        char *cmd="cat > aaa";   ///该命令新建一个文件,提示用户输入数据作为其内容
        char buf[1000]="ni hao wo de peng you!\n";  ///待输入的参数
        if((fp=popen(cmd,"w"))==NULL)
            return 1;
        fwrite(buf,sizeof(char),1000,fp);   ///通过文件描述符写入文件数据
        pclose(fp); ///关闭文件描述符
        exit(0);
        return 0;
    }
    复制代码

     查看结果:(新建了文件aaa,并输入了指定的数据)

  • 相关阅读:
    注册课程程序
    WEB_03
    JAVAWEB学习 HTML&CSS
    JAVAWEB -HTML学习
    二柱子——四则运算——王建民
    JAVA假期第十三天2020年7月18日
    JAVA假期第十二天2020年7月17日
    JAVA假期第十四天2020年7月19日
    JAVA假期第十一天2020年7月16日
    数据库规约
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2989852.html
Copyright © 2020-2023  润新知