2023年8月2日发(作者:)
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", "-l", NULL};
char *arrEnv[] = {"PATH=/bin:/usr/bin", NULL};
execl(“/bin/ls”,”ls”,”-l”,”/etc/passwd”,NULL);
execlp(“ls”,”ls”,”-l”,”/etc/passwd”,NULL);
execv("/bin/ls", arrArg1);
execvp("ls", arrArg1);
execve("/bin/ls", arrArg1, arrEnv);
查看进程的状态: 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. }
发布者:admin,转转请注明出处:http://www.yc00.com/web/1690959490a473225.html
评论列表(0条)