您的当前位置:首页正文

exec函数簇

2024-05-14 来源:钮旅网


exec 6种函数簇形式

什么是exec函数?即它是一种将shell命令 C代码化的函数。 例如:[ls -l] C语言中无法直接使用,当用exec函数调用后,就可以实现。exec函数的参数由NULL作为结尾。

笔记:

①执行exec函数后,程序后面的代码都不会再执行。如果在进程中执行,则该进程在执行exec函数后接收,进程外的代码不受影响。 ②所需头文件:#include

一、int execl(const char *path, const char *arg, ...);

使用方式:

1. execl(\"/bin/ls\",\"ls\",\"-l\",\"/etc/passwd\",NULL); //提供绝对路径去寻找ls文件

解释:从[/bin/ls]中找到ls文件,并调用[ls -l /etc/passwd],查找进程中带有[/etc/passwd]的文本行

效果如下:

二、int execlp(const char *file, const char *arg, ...);

使用方式:

1. execlp(\"ls\",\"ls\",\"-l\",\"/etc/passwd\",NULL); //从PATH环境变量路径寻找ls文

解释:从[PATH环境]中找到ls文件,并调用[ls -l /etc/passwd],查找进程中带有[/etc/passwd]的文本行

效果如下:

三、int execle(const char *path, const char *arg, ..., char * const envp[]);

四、int execv(const char *path, char *const argv[]); 使用方式:

1. char *exec_buf[]= {\"ls\",\"-l\",NULL};

2. execv(\"/bin/ls\", exec_buf); //提供绝对路径寻找ls文件,并且参数以数组形式提

解释:从[/bin/ls]中找到ls文件,并调用[ls -l],查找所有进程

效果如下:

五、int execvp(const char *file, char *const argv[]);

六、int execve(const char *path, char *const argv[], char *const envp[]); 后缀 含义 l v p e l代表list,接受以逗号的参数,最后是以(char *)0结束。 v代表vector,接受参数数组,数组以NULL结束。 p代表取用PATH环境环境寻找可执行文件,不需要单独传入一个路径参数。 取代当前的环境变量 示例:

char *arrArg1[] = {\"ls\

char *arrEnv[] = {\"PATH=/bin:/usr/bin\

execl(“/bin/ls”,”ls”,”-l”,”/etc/passwd”,NULL); execlp(“ls”,”ls”,”-l”,”/etc/passwd”,NULL); execv(\"/bin/ls\execvp(\"ls\

execve(\"/bin/ls\

查看进程的状态: ps –aux

USER 进程的用户; PID 进程的ID;

%CPU 进程占用的CPU百分比; %MEM 占用内存的百分比;

VSZ 该进程使用的虚拟内存量(KB); RSS 该进程占用的固定内存量(KB);

TTY 该进程在哪个终端上运行(登陆者的终端位置),若与终端无关,则显示(?)。若为pts/0等,则表示由网络连接主机进程; START 该进程被触发启动时间;

TIME 该进程实际使用CPU运行的时间; COMMAND 命令的名称和参数;

STAT状态位常见的状态字符

D 无法中断的休眠状态(通常 IO 的进程); R 正在运行可中在队列中可过行的; S 处于休眠状态; T 停止或被追踪;

W 进入内存交换 (从内核2.6开始无效); X 死掉的进程 (基本很少见); Z 僵尸进程;

< 优先级高的进程; N 优先级较低的进程; L 有些页被锁进内存;

s 进程的领导者(在它之下有子进程);

l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads); + 位于后台的进程组;

例子:execl();execlp();execv();

1. #include 2. #include 3. #include

4.

5. //exe函数 6.

7. int main(void) 8. {

9. char buf[50]= {0}; 10. pid_t pid; 11. pid_t pid1;

12. char *exec_buf[]= {\"ls\",\"-1\",NULL}; 13.

14. pid=fork(); 15. if(pid==0) 16. {

17. pid1=fork(); 18. if(pid1==0) 19. {

20. execlp(\"ls\",\"ls\",\"-l\",\"/etc/passwd\",NULL); //从PATH环境变量路径寻找ls文件 21. } 22. else 23. {

24. waitpid(pid1,NULL,0);

25. execl(\"/bin/ls\",\"ls\",\"-l\",\"/etc/passwd\",NULL); //提供绝对路径去寻找ls文件 26. } 27. } 28. else 29. {

30. waitpid(pid,NULL,0); 31. } 32. 33.

34. pid=fork(); 35. if(pid==0) 36. {

37. execv(\"/bin/ls\", exec_buf); //提供绝对路径寻找ls文件,并且参数以数组形式提供 38. } 39. else 40. {

41. waitpid(pid,NULL,0); 42. exit(0); 43. } 44.

45. return 0;

46. }

因篇幅问题不能全部显示,请点此查看更多更全内容