好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

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,并输入了指定的数据)

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于Linux下C编程,进程通信之标准流管道通信(即系统调用)的详细内容...

  阅读:34次