博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
exec函数和system函数
阅读量:3748 次
发布时间:2019-05-22

本文共 2718 字,大约阅读时间需要 9 分钟。

exec函数和system函数

  1. exec系列函数
  2. system函数

exec系列函数

首先讲一下exec,exec系列的函数主要是在代码中去执行可执行程序,类似android中的shellUtils,也就是去执行脚本语言或者执行程序

在用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序

当进程调用一种exec函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其main函数开始执行,因为调用exec并不创建新进程,所以前后的进程ID其实并未改变,exec只是用另一个新程序替换了当前进程的正文,数据,堆和栈段(用新程序的这些存储数据替换掉原来的存储数据)

exec系列相关函数(代码替换函数),所以一般是在子进程中去调用exec系列函数

函数:int execl(const char *pathname,const char *arg0,.../*(char*)0*/);int execv(const char *pathname,char *const argv[]);int execle(const char *pathname,const char *arg0,.../*(char*)0, *const envp[]*/);int execve(const char *pathname,char *const argv[],char *const envp[]);int execlp(const char *pathname,const char *arg0,.../*(char(0)*/); int execvp(const char *pathname,char *const argv[]);返回:出错返回-1,成功不返回exec系列函数的注意点:execve函数是系统调用,其余为库函数,**执行execve函数成功以后后面的代码不会执行,不会返回到原来的子进程中去了**execlp和execvp函数中的pathname,相对路径和绝对路径都可以,其余的必须是绝对路径,相对路径需要在环境变量中注册argv参数为新程序执行的main函数中传递的argv参数,最后一个为NULLenvp为进程的环境表

规律:exec+”替换字符串”,l(list)代表的是参数列表,第二位开始是参数列表,v代表argv,是传递给主函数的参数列表(指针数组形式),e代表的是环境变量,环境表。p第一个元素是pathname(可以是相对路径,也可以是绝对路径),不带p的路径必须是绝对路径

如果执行出错,那就直接中断程序的执行

l---->库函数v---->库函数leve--------->系统调用lpvp

简单实例代码如下

char *cmd1 = "cat";    char *cmd2 = "/bin/cat";    char *argv1 = "/etc/passwd";    char *argv2 = "/etc/bin";    execl(cmd2,cmd2,argv1,argv2,NULL);                  wait(NULL);//等待执行结束    char * argv[4] = {cmd1,argv1,argv2,NULL};    execvp(cmd,argv);

来段简单的小Demo

#include
#include
#include
#include
#include
char * cmd1 = "cat";//相对路径char * cmd2 = "/bin/cat"; //绝对路径char * argv1 = "/etc/passwd";char * argv2 = "/etc/group";int main(int argc,char *argv[]){ pid_t pid = fork(); if(pid <0 ){ perror("fork error"); exit(EXIT_FAILURE); }else if(pid > 0){ wait(0);//通过wait来防止僵尸进程 }else { int result = execl(cmd2,cmd2,argv1,argv2,NULL); //char *argv[4] = {cmd2,argv1,argv2,NULL}; //int result = execvp(cmd2,argv); if(result == -1){ perror("exec error\n"); } } return 0;}

system函数:

#include
int system(const char *command);简化exec函数的使用**system函数内部构建一个子进程,由子进程调用exec函数**等同于/bin/bash -c "cmd"或者 exec("bash","-c","cmd");system中传递的可以是相对路径也可以是绝对路径如简单的实例:char *cmd1 = "date";system(cmd1);

来段简单的小demo

#include
#include
#include
#include
#include
char * cmd1 = "date > a.txt";int main(int agrc,char * argv[]){ //system函数会自己在内部创建一个子进程,调用exec系列函数,来执行; // system(cmd1); system("ls -al"); return 0;}

相比较前面的函数来说,这exec系列的函数和system函数都是非常简单的。就是可以直接能够使用函数来执行命令的,在程序执行的过程中,给我们提供了一些便利性,其实需要注意的是,在执行的时候尽量我们使用的是绝对路径。

谢谢观看
qq群号为324652573

转载地址:http://qwbsn.baihongyu.com/

你可能感兴趣的文章
spark的API操作
查看>>
SparkSql
查看>>
SparkRdd-scala版本
查看>>
spark常见算子
查看>>
scala符号初体验
查看>>
kafka生产者常用参数含义
查看>>
mysql编写函数
查看>>
面试笔试题之hql
查看>>
sql函数之cast()
查看>>
hql中substr函数截取字符串匹配
查看>>
mysql之指定ip、用户、数据库权限
查看>>
zookeeper的读和写数据流程(有图欧)
查看>>
bin/schematool -dbType mysql -initSchema HiveMetaException: Failed to get schema version.
查看>>
flink知识总结
查看>>
flink之检查点(checkpoint)和保存点(savepoint)的区别
查看>>
Linux系统编程---进程I/O
查看>>
spring学习知识补充
查看>>
杂文之生成随机字符串
查看>>
springBoot基础(一)
查看>>
springBoot基础(二)
查看>>