【C++高并发服务器WebServer】-2:exec函数簇、进程控制

打印 上一主题 下一主题

主题 1961|帖子 1961|积分 5883



  
一、exec函数簇先容

exec 函数族的作用是根据指定的文件名找到可实行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部实行一个可实行文件。
exec函数族的函数实行成功后不会返回,由于调用进程的实体,包括代码段,数据段和堆栈等都已经被新的内容(也就是新的进程信息会更换原进程的“用户区”的信息)取代,只留下进程ID等一些表面上的信息仍保持原样(比如PID、PPID、进程组号等这些在内核区的PCB中的信息),颇有些神似“三十六计"中的“金蝉脱壳”。看上去还是旧的躯壳,却已经注入了新的魂魄。只有调用失败了,它们才会返回-1,从原程序的调用点接着往下实行。
二、exec函数簇

  1. int execl(const char *path,const char *arg,.../* (char *) NULL */);
  2. int execlp(const char *file,const char *arg,.../* (char *) NULL */);
  3. int execle(const char *path,const char *arg,.../* (char *) NULL ,char * const envp[] */;
  4. int execv(const char *path,char *const argv[]);
  5. int execvp(const char *file ,char *const argv[]);
  6. int execvp(const char *file,char *const argv[], char *const envp[]);
  7. //前面几个都是标准c库的函数,下面这个是linux的函数,一般来说就最上面两个用的最多。
  8. int execve(const char *filename,char *const argv[],char *const envp[]);
复制代码
l:list参数地址列表,以空指针结尾。
v:vector存有各参数地址的指针数组的地址。
p:path按PATH环境变量指定的目录搜刮可实行文件。
e:environment存有环境变量字符串地址的指针数组地址。
输入man 3 exec查看标准C库的文档解释:

起首在某个文件夹下创建hello.c文件,代码如下:
  1. #include <stdio.h>
  2. int main() {   
  3.     printf("hello, world\n");
  4.     return 0;
  5. }
复制代码
然后在同级文件夹下创建execl.c文件,然后通过gcc exec.c -o exec举行编译。
  1. /*
  2.     #include<unistd.h>
  3.     int execl(const char *path, const char *arg, ...);
  4.     参数:
  5.         -path:
  6.             需要指定的执行的文件路径或者相对路径的名称
  7.             比如a.out 或者/home/linux/a.out
  8.             执行a.out的时候可以传递一些参数,所以后面都是可变参数
  9.         -arg:
  10.             是执行可执行文件需要的参数列表
  11.             第一个参数一般没有什么作用,为了方便,一般写的是程序的名称、
  12.             从第二个参数开始往后,就是程序执行所需要的参数。
  13.             参数最后需要以NULL结束(哨兵)。
  14.     返回值:
  15.         只有出错的时候才会有返回值,返回-1,并且设置errno。
  16.         如果调用成功,没有返回值。
  17.         为什么没有返回值?因为用户区的内容已经被替换了。
  18. */
  19. #include <unistd.h>
  20. #include <stdio.h>
  21. #include<sys/types.h>
  22. int main() {
  23.     // 创建一个子进程,在子进程中执行exec函数族中的函数
  24.     pid_t pid = fork();
  25.     if(pid > 0) {
  26.         // 父进程
  27.         printf("我是父进程, pid : %d\n",getpid());
  28.         sleep(1);
  29.     }else if(pid == 0) {
  30.         // 子进程
  31.         execl("hello","hello",NULL);
  32.                 //也可以试着跑一下系统的shell命令,也就是ps aux查看进程的命令,ps是可执行文件,aux是参数。
  33.                 //execl("/bin/ps", "ps", "aux", NULL);       
  34.     }
  35.     for(int i = 0; i < 3; i++) {
  36.         printf("i = %d, pid = %d\n", i, getpid());
  37.     }
  38.     return 0;
  39. }
复制代码
运行./exec,会发现输出了hello,world! 并且只有父进程在输出for循环,子进程由于跳出实现另一个进程,不会再往下实行了。

下面的execlp函数则是到环境变量(输入env 即可查看环境变量,可以看到ps的环境变量是/usr/local/bin,所以下面的代码是可以成功找到ps并且实行的。)中去找可实行文件,所以不需要路径。
  1. /*  
  2.     #include <unistd.h>
  3.     int execlp(const char *file, const char *arg, ... );
  4.         - 会到环境变量中查找指定的可执行文件,如果找到了就执行,找不到就执行不成功。
  5.         - 参数:
  6.             - file:需要执行的可执行文件的文件名
  7.                 a.out
  8.                 ps
  9.             - arg:是执行可执行文件所需要的参数列表
  10.                 第一个参数一般没有什么作用,为了方便,一般写的是执行的程序的名称
  11.                 从第二个参数开始往后,就是程序执行所需要的的参数列表。
  12.                 参数最后需要以NULL结束(哨兵)
  13.         - 返回值:
  14.             只有当调用失败,才会有返回值,返回-1,并且设置errno
  15.             如果调用成功,没有返回值。
  16.         int execv(const char *path, char *const argv[]);
  17.         argv是需要的参数的一个字符串数组
  18.         char * argv[] = {"ps", "aux", NULL};
  19.         execv("/bin/ps", argv);
  20. */
  21. #include <unistd.h>
  22. #include <stdio.h>
  23. int main() {
  24.     // 创建一个子进程,在子进程中执行exec函数族中的函数
  25.     pid_t pid = fork();
  26.     if(pid > 0) {
  27.         // 父进程
  28.         printf("i am parent process, pid : %d\n",getpid());
  29.         sleep(1);
  30.     }else if(pid == 0) {
  31.         // 子进程
  32.         execlp("ps", "ps", "aux", NULL);
  33.         printf("i am child process, pid : %d\n", getpid());
  34.     }
  35.     for(int i = 0; i < 3; i++) {
  36.         printf("i = %d, pid = %d\n", i, getpid());
  37.     }
  38.     return 0;
  39. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

笑看天下无敌手

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表