exec函数簇

exec函数簇

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条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信