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 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. } 因篇幅问题不能全部显示,请点此查看更多更全内容