美文网首页
unix进程管道

unix进程管道

作者: 越奔跑越渺小 | 来源:发表于2016-09-03 12:35 被阅读0次

最近在要在路由器新加入一个application, 主要作用是 自动切换operation mode.在流程中有一项要测试dns解析是否正常, 当然bash本身就有ping command, 但是有集成到c语言之中,就需要使用进程管道, 我大致看了一下, 功能还不错, 下面介绍一下popen和 pclose

#include <stdio.h> FILE *popen(const char *cmdstring, const char *type); int pclose(FILE *fp);

针对函数介绍几点:

1. popen首先fork一个子进程, 子进程之中调用exec执行 cmdsting命令, 并且返回一个标准IO文件指针,

2. 如果type为”r”,则指针连接到cmdstring 命令的标准输出, 即cmdsting命令的输出返回到该指针,可以从该文件指针读出cmdstring的命令.

3. 如果typr为”w”,则指针连接到cmdstring 命令的标准输入, 即可以向文件指针之中写入信息,给予子进程的标准输入.

4. 子进程cmdstring命令由bash执行, 同时以sh -c cmdstring的形式执行, 意味着shell可以扩展cmdstring的任意字符. exp: ls *.c ; cmd 2>&1

5. 和system一样, pclose也返回shell的终止状态, 如果shell不能执行, pclose的终止状态与shell的终止状态exit(127)的终止状态相同.

同时给出一个示例代码:主要是ping命令的C封装, 测试domain name 或者 ip adderss能否访问, 同时也可以验证dns.

int ping_test(char *adderss, int count){ FILE *fp; char buf[128]; int ping_try, ping_success; sprintf(buf, "ping %s -w %d | grep \"packets received\", address, count); fp = popen(buf, "r"); if(NULL == fp){ return -1; } if(NULL == fgets(buf, sizeof(buf), fp)){ pclose(fp); return -1; } pclose(fp); sscanf(buf, "%d packets transmitted, %d packets received", &ping_try, &ping_success); return ping_success; }

同时在路由器中, 进程, 网络等信息都在/proc文件系统中可以访问到, 这给其他程序查看信息提供了方便. shell中有许多查看信息的工具, 类似cat grep ifconfig等命令可以得到信息, 再使用进程管道就可以 在C程序中使用, 现给出部分通用程序代码:

#include <stdio.h>
#include <unistd.h> int get_shell_info(char *return_info, char *cmd){ FILE *fp; fp = popen(cmd_buf, "r"); if(NULL == fp){ return -1; } if(NULL == fgets(return_info, strlen(return_info), fp)){ pclose(fp); return -1; } pclose(fp); return 1; }

关于程序需要注意的几点:

1. return_info的size是多少, 要编写程序这自己估算, return_info不能过小, 不然会发生信息丢失的情况.

2.  程序只是得到了shell程序的输出, 并没有分析数据, 这部分需要自己实现.

关于通用函数在代码区的使用方法:

#include <stdio.h>
#include <unistd.h>
#define COMMAND "ifconfig eth1 | grep inet" int main(int argc, char **argv){ char info[500]; if(get_shell_info(info, COMMAND) > 0){ ..... } }

相关文章

  • unix进程管道

    最近在要在路由器新加入一个application, 主要作用是 自动切换operation mode.在流程中有一...

  • Unix进程通信:管道

    匿名管道 原理 内核空间的队列式内存(缓冲区) 队列式内存,内核管理同步和互斥,而共享内存和文件通信需要信号量或者...

  • 资深程序员:深入Python进程间通信原理!

    输出 3.14159262176 管道pipe 管道是Unix进程间通信最常用的方法之一,它通过在父子进程之间开通...

  • Linux下进程通信 匿名管道pipe

    匿名管道(pipe): 匿名管道(pipe)是Linux支持的最初Unix IPC形式之一 匿名管道进行父子进程之...

  • unix进程间的通信方式

    参考来源:unix进程间的通信方式 (1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一...

  • 管道专题

    linux管道基本概念 管道基本概念及操作 管道是Unix中最古老的进程间通信的形式。 我们把从一个进程连接到另一...

  • 移动架构<第八篇>:Android 跨进程通信之AIDL通信原理

    在Linux系统中,跨进程通信机制(IPC)有:(1) 半双工Unix管道(2) FIFOs(命名管道)(3) 消...

  • Go & 管道

    管道 管道是不同进程间通信的一种手段,是UNIX系统IPC的最古老形式,管道有如下特点: 历史上,他们是半双工的(...

  • 【Linux】Linux的管道

    管道是Linux由Unix那里继承过来的进程间的通信机制,它是Unix早期的一个重要通信机制。其思想是,在内存中创...

  • Linux的进程间通信:管道(转)

    前言管道是UNIX环境中历史最悠久的进程间通信方式。本文主要说明在Linux环境上如何使用管道。阅读本文可以帮你解...

网友评论

      本文标题:unix进程管道

      本文链接:https://www.haomeiwen.com/subject/dwbkettx.html