linux popen()与system()的区别
linux popen()与system()的区别
popen() 可以在调用程序和POSIX shell /usr/bin/sh 要执行的命令之间创建一个管道(请参阅sh-posix(1) )。
popen() 的参数是指向以空字符结尾的字符串的指针,这些字符串分别包含一个shell 命令行和一个I/O 模式,此
模式可以是进行读取的r ,或进行写入的w 。
popen() 可返回一个流指针,这样,当I/O 模式为w 时,便可以通过写入文件stream 来写入到命令的标准输入;
当I/O 模式为r 时,通过从文件stream 读取数据,从命令的标准输出读取数据。
popen() 打开的流应由pclose() 关闭,这需要等待终止关联的进程,然后返回命令的退出状态。
因为打开的文件是共享的,所以类型为r 的命令可用作输入过滤器,类型为w 的命令可用作输出过滤器。
system() 可执行由command 指向的字符串指定的命令。已执行命令的环境就如同使用fork() (请参阅fork(2) )
创建了一个子进程,子进程按以下方式通过调用execl() (请参阅exec(2) )来调用sh-posix(1) 实用程序:
execl("/usr/bin/sh", "sh", "-c", command, 0);
system() 在等待命令终止时将忽略SIGINT 和SIGQUIT 信号,同时阻塞SIGCHLD 信号。如果这会导致应用程
序错过一个终止它的信号,则应用程序应检查system() 的返回值;如果由于收到某个信号而终止了命令,应用程
序应采取一切适当的措施。
system() 不影响除自己创建的一个或多个进程以外的调用进程的任何子进程的终止状态。
在子进程终止之前, system() 不会返回。
-------------以上来自:https://www.cnblogs.com/lvzaina/archive/2013/02/22/2922858.html
--------------------------
暂时目前同事遇到的问题的是A 监控的一个端口,之后system了一条命令,这条命令去拉去指定位置的批量信息,而且可能会多次运行这条命令(有很多个拉取地址),但是可能在一次拉取过程中,传参或者非法地址等出错了,系统精灵。在重启的时候,获取不到指定的端口,造成错误;
解决的初步思路(未验证);
1,用popen替代system函数;
2,使用 fcntl(fd, F_SETFD, FD_CLOEXEC); 这种操作;
3,在在子进程运行开始处,把父进程的socket描述符close掉。子进程里边做popen之前,遍历下/proc/self/fd下的所有fd,给除了0,1,2以外的其他fd设置下FD_CLOEXEC,之后再调用下边的popen命令(这个可能会出问题,太粗暴);
4,遍历的时候分析下描述符对应的软连接是不是指向一个socket,以免错杀无辜的描述符。 给一个参考链接:http://blog.chinaunix.net/uid-317451-id-92698.html
linux popen()与system()的区别的更多相关文章
- linux下代替system的基于管道的popen和pclose函数
linux下使用system需要谨慎,那么代替它的方法是什么呢? 标准I/O函数库提供了popen函数,它启动另外一个进程去执行一个shell命令行. 这里我们称调用popen的进程为父进程,由pop ...
- 【C/C++】Linux下使用system()函数一定要谨慎
[C/C++]Linux下使用system()函数一定要谨慎 http://my.oschina.net/renhc/blog/53580 曾经的曾经,被system()函数折磨过,之所以这样,是因为 ...
- [转载]Linux下关于system调用
曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入.只是简单的知道用这个函数执行一个系统命令,这远远不够,它的返回值.它所执行命令的返回值以及命令执行失败原 ...
- Linux编程return与exit区别
Linux编程return与exit区别 exit 是用来结束一个程序的执行的,而return只是用来从一个函数中返回. return return 表示从被调函数返回到主调函数继续执行,返回时可附 ...
- windows系统以及linux系统的优缺点以及区别
一.Linux以及Windows系统的优缺点对比 Windows Linux 优点 Windows Server系统相对于其他服务器系统而言,极其易用,极大降低使用者的学习成本. Linux系统是 ...
- 【转载】LINUX 和 WINDOWS 内核的区别
LINUX 和 WINDOWS 内核的区别 [声明:欢迎转载,转载请注明出自CU ACCESSORY http://linux.chinaunix.net/bbs/thread-1153868-1-1 ...
- 关于linux中的system函数
Linux下使用system()函数一定要谨慎 https://blog.csdn.net/senen_wakk/article/details/51496322 system()正确应用 https ...
- Linux useradd 与 adduser的区别, /sbin/nologin 与 /bin/bash
摘自:https://blog.csdn.net/danson_yang/article/details/65629948 Linux useradd 与 adduser的区别, /sbin/nolo ...
- popen和system问题
popen和system问题 1. 问题描述 C的代码里面去调用命令启动一个shell脚本,分别使用了下面两个途径. 其中一个是: func1(cmd) { popen(cmd,type); pclo ...
随机推荐
- 删除一个存在的RabbitMQ队列
import sys # pip install kafka-python sys.path.append("/usr/local/software/ELK") from Util ...
- 扩展BSGS算法
求解A^x ≡ B mod P (P不一定是质数)的最小非负正整数解 先放几个同余定理: 一.判断如果B==1,那么x=0,算法结束 二.若gcd(A,P)不能整除 B,则 无解,算法结束 三.若gc ...
- ubuntu axel
ubuntu下rar解压工具安装方法: 压缩功能 安装 sudo apt-get install rar 卸载 sudo apt-get remove rar 解压功能 安装 sudo apt-get ...
- Codeforces 891C Envy
Envy 感觉这种最小生成树上的啥题都差不多的解法.. #include<bits/stdc++.h> #define LL long long #define fi first #def ...
- BZOJ4977 八月月赛 Problem G 跳伞求生 set 贪心
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4977 - 八月月赛 Problem G 题意 小明组建了一支由n名玩家组成的战队,编号依次为1到n ...
- 【noip模拟赛4】Matrix67的派对 dfs
描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排在圆桌上.Matrix67的安排原则是,圆桌 ...
- 071 HBase的安装部署以及简单使用
一:下载安装 1.下载安装 2.开启hadoop与zookeeper 3.修改配置文件hbase-env export JAVA_HOME=/opt/modules/jdk1.7.0_67 expor ...
- 067 Flume协作框架
一:介绍 1.概述 ->flume的三大功能 collecting, aggregating, and moving 收集 聚合 移动 数据源:web service ...
- python使用 requirements.txt 管理所需的包
使用 requirements.txt 管理所需的包 2019/01/28 作者 若要与其他人共享项目.使用生成系统,或打算将项目复制到需要在其中还原环境的其他任何位置,必须指定项目需要的外部包. 建 ...
- 使用metasploit做SNMP扫描和利用
使用MSF用于SNMP扫描 auxiliary/scanner/snmp/snmp_login 介绍 补充知识: 在执行SNMP扫描之前,需要了解几件事情.首先,“只读”和“读写”团体名(commun ...