使用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]关于分支Sequence和条件分支的组合用法
当需要不管条件语句是否成立的后面都需要执行的语句,可以使用“Sequence”来分支,达到简化蓝图连线的目的.如下图所示:
- Java内存泄漏简单说明
Java语言的一个关键的优势就是它的内存管理机制.你只管创建对象,Java的垃圾回收器帮你分配以及回收内存.然而,实际的情况并没有那么简单,因为内存泄漏在Java应用程序中还是时有发生的. 下面就解释 ...
- ie-table不显示边框解决办法
.thisTd { background-clip: padding-box; position:relative; } 原来背景也有边界的:决定背景会盖住哪些部 ...
- delphi打开项目提示unable to find resource on dll projects
用记事本打开*.dof文件, 把这行[Resource DLL Projects]及它的所属的内容删除就行了.
- alt.js 使用教程
1.action : import alt from "../alt.js"; class DemoActions{ constructor() { this.generateAc ...
- 16 Linux系统的文件压缩、解压与归档
这一节的内容,我们详细介绍下Linux的文件压缩.解压缩与文件归档的内容,也就是tar.gzip.bzip2.xz等命令的内容: 压缩(compress)与解压缩(uncompress) Linux系 ...
- 初级安全入门——XSS注入的原理与利用
XSS的简单介绍 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者 ...
- angularjs路由相关知识
angular.module('app').config(['$stateProvider','$urlRouterProvider',function($stateProvider,$urlRout ...
- mocha测试接口类型及测试报告收集
记录参考: 参考文档: 测试报告以及es6: http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html 测试接口 ...
- centos7 图形化界面
当你安装centos服务器版本的时候,系统默认是不会安装 CentOS 的图形界面程序的,比如:gnome或者kde, 那么如果你想在图形界面下工作的话,可以手动来安装CentOS Gnome GUI ...