使用exec函数将当前的信息输入到文件中
先来看看exec函数:
exec函数族
fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。
将当前进程的.text、.data替换为所要加载的程序的.text、.data,然后让进程从新的.text第一条指令开始执行,但进程ID不变,换核不换壳。
其实有六种以exec开头的函数,统称exec函数:
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);
execlp函数
加载一个进程,借助PATH环境变量
int execlp(const char *file, const char *arg, ...); 成功:无返回;失败:-1
参数1:要加载的程序的名字。该函数需要配合PATH环境变量来使用,当PATH中所有目录搜索后没有参数1则出错返回。
该函数通常用来调用系统程序。如:ls、date、cp、cat等命令。
如你所见,exec函数实际上时一族函数:有6个。解决标题的问题这几个都可以用,但是我使用execlp函数。
先来看看它的用法:
它的原型:int execlp(const char *file, const char *arg, …);
这是一个变参函数。第一个参数是可执行文件的名称,可以不用指定文件目录,他会自动在当前的环境变量中查找,适用于使用系统可执行文件来创建一个进程这样的场合。相信知道exec函数的人应该知道它是用来干嘛的吧?如果不知道,请自行www.baidu.com或www.google.com。一个示例:execlp("ls", "ls", "-l", "-f", NULL); 使用程序名在PATH中搜索。用NULL作为哨兵
所以,我们可以利用它在使程序执行本身的过程中执行其他可执行文件。查看当前进程的命令:ps aux 然后要将它输入到文件中去,怎么办呢?重定向! ps aux > out.txt 但是我们能直接在程序中这么写么?答案是不能。为什么?因为>是转义字符。(别嫌我啰嗦,大部分人基础都不咋地,我也是。基础好的话也不会来写这个来加强记忆了。)所以,我们实际上要这样做:execlp("ps","ps","aux","\>","o_ret",NULL); o_ret是一个自定义文件描述符。
懂了吗?但是,我要说但是!这不行!为什么?来,我们来看看,execlp("ps","ps","aux","\>","o_ret",NULL);如果我们是在shell环境中执行这个函数所做的事,那我们是这样执行的:ps aux > o_ret 请问,请问,o_ret是什么?shell环境知道么?他不知道!所以,命令执行失败。
那么怎么办?没事,有办法,知道dup2函数么?(不能读成dup2(er),应该是dup(to))他将一个文件描述符复制给另一个文件描述符。大家应该知道一句话,在Linux中,一切皆文件。那么标准输入输出流,标准错误流是不是文件?是,并且他们三一直占用这文件描述符的前三。我不是说他们的使用频率,我是说他们的地位,我们用户自定义的文件描述符最牛逼也就只能排在3号位置,前面的0,1,2是他们的天下。
如果,如果我们用dup2函数将o_ret复制给stdout,会发生什么?是的,原先默认输出到屏幕上的东西都会输出到o_ret指向的文件中去。我们还用去重定向么?不用,还要去使用转义字符么?不用。
说了这么些,如果认真看,应该是会有一些明悟的。接下来上代码:
#include
<cstdio>
#include
<sys/types.h>
#include
<sys/stat.h>
#include
<fcntl.h>
#include
<unistd.h>
#include
<stdlib.h>
int main()
{
int o_ret, e_ret, c_ret;
o_ret = open("process_information.txt", O_RDWR | O_CREAT | O_TRUNC, 0644);//创建文件,若存在,截断;权限644
if (-1 == o_ret)
{
perror("file ");
exit(1);
}
dup2(o_ret, STDOUT_FILENO);
e_ret = execlp("ps", "ps", "aux", nullptr);
//第一个ps是让函数去找这个可执行文件,第二个ps是argv[0]参数,这里我是这么理解的,函数找到ps文件后,开辟一个shell空间,然后使用后面的参数来执行。
//可参考:https://baike.baidu.com/item/execlp
if (-1 == e_ret)
{
perror("execlp() ");
//exit(1); 执行到这儿了,如果退出,打开的文件怎么办?
}
c_ret = close(o_ret);
if (-1 == c_ret)
{
puts("close file failure");
}
printf("c_ret = %d\n", c_ret);
printf("hello from processInformation_printf_file!\n");
return 0;
}
使用exec函数将当前的信息输入到文件中的更多相关文章
- 【转】【整理】将Linux脚本中的正常输出,警告,错误等信息输出到文件中
本文来自:http://blog.csdn.net/woshinia/article/details/18040063 很早以前 编译的时候 就在用 2>&1,但是一直没有生成一 ...
- 将Linux下编译的warning警告信息输出到文件中[整理笔记]
Linux中,脚本语言环境中,即你用make xxx即其他一些普通linux命令,比如ls,find等,不同的数字,代表不同的含义: 数字 含义 标准叫法0 标准输入 stdin = standar ...
- JDBC程序优化--提取配置信息放到属性文件中
JDBC程序优化--提取配置信息放到属性文件中 此处仅仅优化JDBC连接部分,代码如下: public class ConnectionFactory { private static String ...
- iOS中忽略NSLog打印信息(通过PCH文件中定义DEBUG宏解决)
iOS中忽略NSLog打印信息 解决办法: 1.新建PrefixHeader_pch文件,在该文件中定义一下宏 //通过DEBUG宏的定义来解决Debug状态下和Release状态下的输出 #ifde ...
- Android 之 PackageManager获取的应用程序信息与AndroidManifest文件中设置的信息不一致问题
有时我们需要用 PackageManager 来获取应用程序的版本号和版本名称等信息,通过以下代码来获取: PackageManager manager = getPackageManager(); ...
- 使用 Trace 将日志输入到文件中
工具没有好坏,只有适不适用.由于项目中用 Log4Net 过重,所以使用 Trace 代替了 Log4Net 输入一些简单的日志信息: 自定义监听文件 using System; using Syst ...
- linux下将终端的输入存入文件中
代码很简单: #include <stdlib.h> #include <fcntl.h> #include <stdio.h> #include <unis ...
- exec()函数问题
源代码: 在网上也搜索了答案 比较详细的答案是: <?php exec("lsof -i:80",$out,$status); 结果: var_dump($out); arr ...
- linux重定向总结:如何将shell命令的输出信息自动输出到文件中保存
在做批量实验室,例如跑批量MR的作业,我们会写好shell脚本,然后启动脚本,等所有作业执行完再去看结果,但是这些执行时的信息如何保存下来到文件中呢?下面这个命令可以完成这个任务. sh batchj ...
随机推荐
- [UE4]蓝图使用GameMode重构
GameMode的生命周期贯穿整个游戏,当然也包括各个关卡.因此可以把各个关卡都需要的功能放置在GameMode,以达到功能共享.重复利用的目的!
- 修改IP和DNS的dos命令
修改IP,掩码,网关命令: netsh interface ip set address "本地连接" static 192.168.3.188 255.255.255.0 192 ...
- 本地IP,掩码,网关,DNS设置
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- c# 未能加载文件或程序集
最近做项目时碰到这个问题了,goole.百度了半天,整理了以下几种可能: DLL文件名与加载时的DLL文件名不一致, DLL文件根本不存在,即出现丢失情况, 加载DLL路径错误,即DLL文件存在,但加 ...
- 07 grep命令与正则表达式
grep命令 首先我们知道grep命令是用来做文件内容过滤的!如果你要在文件中查找一些对应的内容,我们如何来过滤找到其中我们需要符合条件的内容呢?grep命令结合正则表达式就可以实现: grep.eg ...
- C#常用类操作
C#提供了许多可以直接使用的类代码. 1. Convert类 Convert类提供了很多静态方法成员,用于实现数据类型的转换. Convert类的常用方法 ...
- form表单钩子,局部钩子和全局钩子
form表单源码解析: 局部钩子: 全局钩子:
- Python ————反射机制
python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. ...
- MySQL死锁问题分析及解决方法实例详解(转)
出处:http://www.jb51.net/article/51508.htm MySQL死锁问题是很多程序员在项目开发中常遇到的问题,现就MySQL死锁及解决方法详解如下: 1.MySQL常用 ...
- TIDB-cenos7开发环境搭建
1.安装centos7,注意要安装桌面,如果最小化安装,无法使用IDE了 关闭防火墙或者打开4000端口 systemctl stop firewalld.service #停止firewall sy ...