当前位置: 首页 > news >正文

Linux进程——system函数、popen函数

system函数(执行shell 命令)

头文件

#include <stdlib.h>

函数定义

int system(const char * string);

函数说明

        system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。

返回值

        如果system()调用/bin/sh时失败则返回127其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值。如果 system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。

附加说明

        在编写具有SUID/SGID权限的程序时请勿使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题

代码示例

#include<stdio.h>
#include <unistd.h>
int main()
{int a= 0;int fork_r=0;while(1){                printf("please input a num\n");scanf("%d",&a);if(a==1){fork_r=fork();if(fork_r==0){
//             	 		execl("./changeData","changeData",NULL,NULL);system("./changeData");//直接将可执行文件字符串输入便会执行指令}}else{printf("no change success\n");}}return 0;
}

直接调用changeData可执行文件并执行,成功将数据修改。

popen函数(执行shell 命令,同时可以获取运行的输出结果)

头文件

#include <stdio.h>

函数定义

FILE popen( const char* command, const char* mode )

函数说明

command: 是一个指向以 NULL 结束的 shell 命令字符串的指针。这行命令将被传到 bin/sh 并使用 -c 标志,shell 将执行这个命令。
type: 只能是读或者写中的一种。
如果 type 是 “r” 则文件指针连接到 command 的标准输出;
如果 type 是 “w” 则文件指针连接到 command 的标准输入。

依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针,随后进程便可利用此文件指针来读取子进程的输出设备或是写入到子进程的标准输入设备中。

返回值

成功,则返回一个读或者打开文件的指针
失败,返回NULL,具体错误要根据errno判断

附加说明

popen函数建立的管道连到子进程的输出或输入设备即读写操作需要调用到前面学过的fread(读)和fwrite(写)

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);

popen() 函数用于创建一个管道:其内部实现为调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程,而这个进程必须由 pclose() 函数关闭。stream是popen返回的文件指针。

int pclose(FILE *stream);

代码示例

#include <stdio.h>int main()
{char result[512]={0};FILE *fp = NULL;int n_read = 0;fp = popen("ps","r");//r为输出(读取)n_read = fread(result,1,128,fp);//每次读一个字节,总共读512次(小于512则会读真实值,大于512会报错),将fp的内容读取到resultprintf("read %d byte to result,result = %s\n",n_read,result);pclose(fp);	return 0;
}

成功获取运行输出结果并将其打印出来。

相关文章:

  • windows排除故障工具pathping、MTR、sysinternals
  • 替换SlowFast中Detectron2为Yolov8
  • 信息系统项目管理师 第四版 第23章 组织通用管理
  • 大数据HCIE成神之路之数学(3)——概率论
  • phpStorm Xdebug调试 加FireFox浏览器
  • 在线生成含logo的彩色二维码工具
  • 如何解决msvcr100.dll丢失问题?5个实用的解决方法分享
  • SpringCloud-Gateway修改Response响应体,并解决大数据量返回不全等问题
  • C++中使用 min()函数/max()函数进行多数比较
  • EDA实验-----4*4矩阵键盘与数码管显示测试
  • LeetCode27.移除元素(暴力法、快慢指针法)
  • ROS 学习应用篇(八)ROS中的坐标变换管理之tf广播与监听的编程实现
  • Scalable Exact Inference in Multi-Output Gaussian Processes
  • 设计模式 -- 适配器模式(Adapter Pattern)
  • C/C++轻量级并发TCP服务器框架Zinx-框架开发002: 定义通道抽象类
  • 【Leetcode】101. 对称二叉树
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • css属性的继承、初识值、计算值、当前值、应用值
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • es6(二):字符串的扩展
  • Javascript 原型链
  • Java深入 - 深入理解Java集合
  • js面向对象
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Laravel5.4 Queues队列学习
  • node入门
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 工作中总结前端开发流程--vue项目
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 简单易用的leetcode开发测试工具(npm)
  • 看域名解析域名安全对SEO的影响
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 如何胜任知名企业的商业数据分析师?
  • 系统认识JavaScript正则表达式
  • 一、python与pycharm的安装
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • NLPIR智能语义技术让大数据挖掘更简单
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • # 数据结构
  • #includecmath
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .md即markdown文件的基本常用编写语法
  • .NET Project Open Day(2011.11.13)
  • .net快速开发框架源码分享
  • :not(:first-child)和:not(:last-child)的用法
  • @Autowired多个相同类型bean装配问题
  • @html.ActionLink的几种参数格式
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [acm算法学习] 后缀数组SA
  • [AR]Vumark(下一代条形码)