Linux下C编程,进程通信之标准流管道通信(即系统调用)-阿里云开发者社区

开发者社区> 旭东的博客> 正文

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

简介: 1.概述   在编程的过程中总会需要使用系统调用,如linux下的ps,touch,rm,grep命令等;windows下的dir,mkdir,del命令等。   在linux中执行系统调用,通常使用标准流管道。
+关注继续查看

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Chromium中跨进程文件句柄传递
实现说明 在Chromium跨进程架构下,也会有Browser/Renderer两个进程对相同文件进行操作的需求。
911 0
Linux下select调用引发的血案
Select函数使用简单,其工作原理大家通常也知道,但是在实际的使用过程中可能并没有严格遵守,而且确实也比较难以完全遵守,除非不使用它。 Select采用一个bit表,每个fd对应表中的一个bit位,宏FD_SETSIZE为表的大小,添加到fd_set中的fd值必须小于FD_S...
867 0
《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》——2.14 进程0由0特权级翻转到3特权级,成为真正的进程
本节书摘来自华章计算机《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》一书中的第2章,第2.14节,作者:新设计团队著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1163 0
Linux系统小技巧(5):如何列出和排序正在读写的进程?
如何利用经典UNIX工具列出正在读写的进程并且排序之?
2022 0
《UNIX网络编程 卷2:进程间通信(第2版)》——1.9 小结
各种类型IPC的持续性可以是随进程持续的、随内核持续的或随文件系统持续的,这取决于IPC对象存在时间的长短。在为给定的应用选择所用的IPC类型时,我们必须清楚相应IPC对象的持续性。
1222 0
《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》——2.9 初始化进程0
本节书摘来自华章计算机《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》一书中的第2章,第2.9节,作者:新设计团队著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1461 0
《UNIX网络编程 卷2:进程间通信(第2版)》——2.2 IPC名字
这也许是你第一次碰到snprintf函数。许多现有代码调用的是sprintf,但是sprintf不检查目标缓冲区是否溢出,不过snprintf要求其第二个参数是目标缓冲区的大小,因此可确保缓冲区不溢出。提供能有意溢出一个程序的sprintf缓冲区的输入数据是黑客们已使用很多年的一种攻破系统的方法
1813 0
Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介
原文:Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介 Linux内核分析(四) 两天没有更新了,上次博文我们分析了linux的内存管理子系统,本来我不想对接下来的进程管理子系统、网络子系统、虚拟文件系统在这个阶段进行分析的,但是为了让大家对内核有个整体的把握,今天还是简单的介绍一下剩余的几个子系统,我们对这几个子系统的分析,只要了解其作用和部分内容即可,不必深究,等我们写上几个驱动,到时候按照驱动再来分析这几个子系统我们就清晰多了。
949 0
+关注
旭东的博客
从事互联网开发工作,写博客,记录问题与学习支持,并分析
194
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载