使用exec函数将当前的信息输入到文件中

时间:2021-11-15 01:16:49

先来看看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函数将当前的信息输入到文件中的更多相关文章

  1. 【转】【整理】将Linux脚本中的正常输出,警告,错误等信息输出到文件中

     本文来自:http://blog.csdn.net/woshinia/article/details/18040063   很早以前  编译的时候 就在用 2>&1,但是一直没有生成一 ...

  2. 将Linux下编译的warning警告信息输出到文件中&lbrack;整理笔记&rsqb;

    Linux中,脚本语言环境中,即你用make xxx即其他一些普通linux命令,比如ls,find等,不同的数字,代表不同的含义: 数字 含义 标准叫法0 标准输入  stdin = standar ...

  3. JDBC程序优化--提取配置信息放到属性文件中

    JDBC程序优化--提取配置信息放到属性文件中 此处仅仅优化JDBC连接部分,代码如下: public class ConnectionFactory { private static String ...

  4. iOS中忽略NSLog打印信息&lpar;通过PCH文件中定义DEBUG宏解决&rpar;

    iOS中忽略NSLog打印信息 解决办法: 1.新建PrefixHeader_pch文件,在该文件中定义一下宏 //通过DEBUG宏的定义来解决Debug状态下和Release状态下的输出 #ifde ...

  5. Android 之 PackageManager获取的应用程序信息与AndroidManifest文件中设置的信息不一致问题

    有时我们需要用 PackageManager 来获取应用程序的版本号和版本名称等信息,通过以下代码来获取: PackageManager manager = getPackageManager(); ...

  6. 使用 Trace 将日志输入到文件中

    工具没有好坏,只有适不适用.由于项目中用 Log4Net 过重,所以使用 Trace 代替了 Log4Net 输入一些简单的日志信息: 自定义监听文件 using System; using Syst ...

  7. linux下将终端的输入存入文件中

    代码很简单: #include <stdlib.h> #include <fcntl.h> #include <stdio.h> #include <unis ...

  8. exec&lpar;&rpar;函数问题

    源代码: 在网上也搜索了答案 比较详细的答案是: <?php exec("lsof -i:80",$out,$status); 结果: var_dump($out); arr ...

  9. linux重定向总结:如何将shell命令的输出信息自动输出到文件中保存

    在做批量实验室,例如跑批量MR的作业,我们会写好shell脚本,然后启动脚本,等所有作业执行完再去看结果,但是这些执行时的信息如何保存下来到文件中呢?下面这个命令可以完成这个任务. sh batchj ...

随机推荐

  1. Linux挂载卸载光盘&amp&semi;实践

    在Linux下有时候需要挂载光盘,拷贝文件或安装系统,例如拷贝Redhat操作系统镜像文件等.下面介绍一下在Linux系统下挂载.卸载光盘的方法. 在Linux系统中,每一个物理设备都可以看做是一个文 ...

  2. Spring的IOC逐层深入——依赖注入的两种实现类型

    构造器注入 构造器注入,即通过构造函数完成依赖关系的设定.我们看一下spring的配置文件: <?xml version="1.0" encoding="UTF-8 ...

  3. codeforces 540B&period;School Marks 解题报告

    题目链接:http://codeforces.com/problemset/problem/540/B 题目意思:给出 k 个test的成绩,要凑剩下的 n-k个test的成绩,使得最终的n个test ...

  4. 通过iphone蓝牙与经过苹果MFI授权认证的硬件通讯,传输图片&lpar;转&rpar;

    http://blog.csdn.net/hwj2012/article/details/7883711 相关: http://blog.csdn.net/xufeidll/article/detai ...

  5. Error updating database&period; Cause&colon; java&period;sql&period;BatchUpdateException&colon; Field &&num;39&semi;id&&num;39&semi; doesn&&num;39&semi;t have a default value

    异常信息 ### Error updating database. Cause: java.sql.BatchUpdateException: Field 'id' doesn't have a de ...

  6. zookeeper的分布式锁

    实现分布式锁目前有三种流行方案,分别为基于数据库.Redis.Zookeeper的方案,其中前两种方案网络上有很多资料可以参考,本文不做展开.我们来看下使用Zookeeper如何实现分布式锁. 什么是 ...

  7. css中的宽高以及百分比参照

    百分比数参照物    父元素宽度:padding,margin,width,text-indent 父元素高度:height 自身:transform中的translate() 其他单位     vh ...

  8. 反序列化和序列化xml使用反射处理节点的属性

    当一个xml中有大量的属性XmlAttribute需要序列化和反序列化,通常需要复制粘贴大量的如下代码,显得很丑陋,而且容易出错: XmlAttribute attr = Doc.CreateAttr ...

  9. 第一课、安装登录CentOS7

    一.学习之初 1.学习这个课程的目的是,高薪就业,搞运维. 2.应该在宁波发展. 3.大概给自己定的计划是4个月能学习2遍. 4.学好之后就跳槽. 5.2年左右的时间要达到1.5W争取. 学习方法: ...

  10. 使用pymysql 操作MySQL数据库

    安装 pip install pymysql 注:连接前要有可使用的账户及有权限.可操作的数据库 先来一个栗子: import pymysql # 连接database conn = pymysql. ...