unix进程管道
2016-01-21 00:00
459 查看
unix创建进程 管道
最近在要在路由器新加入一个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; }
关于程序需要注意的几点
return_info的size是多少, 要编写程序这自己估算, return_info不能过小, 不然会发生信息丢失的情况.
程序只是得到了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){ ..... } }
刚才又看了看python的subprocess.Popen, 感觉封装的蛮好, 文章地址
相关文章推荐
- 5 个用于在 Linux 终端中查找域名 IP 地址的命令
- 如何让 Ping 的输出更简单易读
- C#实现Ping的方法小结
- .net实现ping的实例代码
- Ping服务的php实现方法,让网站快速被收录
- IP策略实现服务器禁止Ping
- 服务器禁止被ping的设置方法(图文)
- perl ping检测功能脚本代码
- javascript模拟的Ping效果代码 (Web Ping)
- 纯Javascript实现ping功能的方法
- php实现的ping端口函数实例
- python在windows下实现ping操作并接收返回信息的方法
- python使用xmlrpclib模块实现对百度google的ping功能
- 配置win2008防火墙 允许被Ping的设置方法
- Python实现快速多线程ping的方法
- Python实现检测服务器是否可以ping通的2种方法
- python实现ping的方法
- [Linux学习笔记] Linux常用命令 - 网络通信命令
- Mybatis破MySql8小时断线问题
- 大家来参考,是否本博客需要增加又拍云存储呢?