先来看看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 ...
随机推荐
-
Linux挂载卸载光盘&;实践
在Linux下有时候需要挂载光盘,拷贝文件或安装系统,例如拷贝Redhat操作系统镜像文件等.下面介绍一下在Linux系统下挂载.卸载光盘的方法. 在Linux系统中,每一个物理设备都可以看做是一个文 ...
-
Spring的IOC逐层深入——依赖注入的两种实现类型
构造器注入 构造器注入,即通过构造函数完成依赖关系的设定.我们看一下spring的配置文件: <?xml version="1.0" encoding="UTF-8 ...
-
codeforces 540B.School Marks 解题报告
题目链接:http://codeforces.com/problemset/problem/540/B 题目意思:给出 k 个test的成绩,要凑剩下的 n-k个test的成绩,使得最终的n个test ...
-
通过iphone蓝牙与经过苹果MFI授权认证的硬件通讯,传输图片(转)
http://blog.csdn.net/hwj2012/article/details/7883711 相关: http://blog.csdn.net/xufeidll/article/detai ...
-
Error updating database. Cause: java.sql.BatchUpdateException: Field &#39;id&#39; doesn&#39;t have a default value
异常信息 ### Error updating database. Cause: java.sql.BatchUpdateException: Field 'id' doesn't have a de ...
-
zookeeper的分布式锁
实现分布式锁目前有三种流行方案,分别为基于数据库.Redis.Zookeeper的方案,其中前两种方案网络上有很多资料可以参考,本文不做展开.我们来看下使用Zookeeper如何实现分布式锁. 什么是 ...
-
css中的宽高以及百分比参照
百分比数参照物 父元素宽度:padding,margin,width,text-indent 父元素高度:height 自身:transform中的translate() 其他单位 vh ...
-
反序列化和序列化xml使用反射处理节点的属性
当一个xml中有大量的属性XmlAttribute需要序列化和反序列化,通常需要复制粘贴大量的如下代码,显得很丑陋,而且容易出错: XmlAttribute attr = Doc.CreateAttr ...
-
第一课、安装登录CentOS7
一.学习之初 1.学习这个课程的目的是,高薪就业,搞运维. 2.应该在宁波发展. 3.大概给自己定的计划是4个月能学习2遍. 4.学好之后就跳槽. 5.2年左右的时间要达到1.5W争取. 学习方法: ...
-
使用pymysql 操作MySQL数据库
安装 pip install pymysql 注:连接前要有可使用的账户及有权限.可操作的数据库 先来一个栗子: import pymysql # 连接database conn = pymysql. ...