首页 > 系统相关 >进程控制之exec函数族

进程控制之exec函数族

时间:2023-02-03 11:22:47浏览次数:46  
标签:ps const 函数 exec int pid char 进程 NULL

 一、引言

进程通过exec函数根据指定的文件名或目录名执行另一个可执行文件,当进程调用exec函数时,该进程的数据段、代码段和堆栈段完全被新程序替换,从新程序的启动例程开始执行。但调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。

1. 函数说明

头文件:#include <unistd.h>

函数原型:

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

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

 

int execve(const char *path, char *const argv[], char *const envp[]);

 

int execv(const char *path, char *const argv[]);

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

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

 

返回值:成功:无返回;失败:-1

 

查找方式:前4个函数的查找方式都是完整的文件目录路径(即绝对路径),而最后两个函数(以p结尾的两个函数)可以只给出文件名,系统就会自动从环境变量“$PATH”所指出的路径中进行查找。

参数传递方式:一种是逐个列举的方式(含有字母“l”),另一种是将所有参数整体构造成一个指针数组(含有字母“v”),然后将该数组的首地址当做参数传递给它,数组中的最后一个指针要求为NULL)

环境变量:exec函数族使用了系统默认的环境变量,也可以传入指定的环境变量。这里以“e”结尾的两个函数就可以在envp[]中指定当前进程所使用的环境变量替换掉该进程继承的所有环境变量。

p (path) 搜素file时使用path变量(文件名)

l (list) 命令行参数列表

v (vector) 使用命令行参数数组

e (environment) 使用环境变量数组,不使用进程原有的环境变量,设置新加载程序运行的环境变量

例程:

复制代码
char *const argv[] = {"ps", "-o", "pid, ppid, session, tpgid, comm, NULL"};

char *const envp[] = {"PATH=/bin:/usr/bin", "TERM=console", NULL};

execl("/bin/ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL);

execv("/bin/ps", argv);

execle("/bin/ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL, envp);

execve("/bin/ps", argv, envp);

execlp("ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL);

execvp("ps", argv);
复制代码

完整程序:第一个参数为该应用程序的名称

1) execl()

复制代码
 1 #include <stdio.h>
 2 #include <unistd.h>
 3 
 4 int main(void)
 5 {
 6     pid_t pid = fork();
 7 
 8     if (pid == 0) {  
 9         execl("/work/material/linux-系统编程/day01/4-源代码/01_process_test/exec/output", "output", NULL);
10     } else if (pid > 0) {
11         printf("i'm parent pid = %d\n", getpid());
12     sleep(10);
13     }
14 
15     return 0;
16 }
复制代码

2) execlp()

复制代码
 1 #include <stdlib.h>
 2 #include <unistd.h>
 3 #include <stdio.h>
 4 int main(int argc, char *argv[])
 5 {
 6     char *argvv[] = {"ls", "-l", "-F", "R", "-a", NULL};
 7     pid_t pid = fork();
 8     if (pid == 0) {
 9     execlp("ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL);
10     //********下面不再运行***********//
11         execl("/bin/ls", "ls", "-l", "-F", "-a", NULL);
12         printf("I am child\n");
13         execv("/bin/ls", argvv);
14         perror("execlp");
15         exit(1);
16     } else if (pid > 0) {
17         sleep(2);
18         printf("I am parent\n");
19     }
20     return 0;
21 }
复制代码

 注意:一个进程一旦调用exec类函数,它本身就不再运行了。

标签:ps,const,函数,exec,int,pid,char,进程,NULL
From: https://www.cnblogs.com/kn-zheng/p/17088538.html

相关文章

  • 进程间通信之fifo
    一、引言FIFO常被称为有名管道,不同于管道(pipe)。pipe仅适用于“有血缘关系”的IPC。但FIFO还可以应用于不相关的进程的IPC。实际上,FIFO是Linux基础文件类型中的一......
  • c++中调用QML中的函数和设置QML中的属性的问题
    1.这里主要是介绍,如何在c++中调用QML中的函数和设置QML中的属性的问题  2.具体代码    //UICtest.qmlimportQt4.7Rectangle{   id:mainWid......
  • kotlin的拓展函数和原理
    kotlin的拓展函数和原理问题背景kotlin的使用过程中有个拓展函数的概念,这个概念在java中是没有的,那么问题来了,kotlin中拓展函数是什么呢?拓展函数的概念:不改变原有类的情......
  • inline内联函数详解
    这几天看题解一直遇到inline所以学习总结一下1、C++inline内联函数(1)引入inline关键字的原因:在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入......
  • c分配内存底层函数 realloc
    realloc(void*__ptr,size_t__size):更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小。如果将分配的内存减少,realloc仅仅是改变索引的信息。如果是将......
  • oracle 自定义函数splitstr
     函数主体createorreplacetypetype_splitastableofvarchar2(4000) createorreplacefunctionsplitstr(p_stringvarchar2,......
  • #yyds干货盘点# 歌谣学前端之箭头函数1
    前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从......
  • PHP精度计算函数
    bcadd—将两个高精度数字相加bccomp—比较两个高精度数字,返回-1,0,1bcdiv—将两个高精度数字相除bcmod—求高精度数字余数bcmul—将两个高精度数字相乘bc......
  • TypeScript笔记 - 函数
    注解函数函数需要注解的部分其实只有参数值和返回值letcheckFunc=(str:string):boolean=>{returnstr['includes']('a')}checkFunc('abc') 使用接口......
  • py10函数之嵌套-名称空间作用域
    #函数是第一类对象:函数名指向的值可以被当中参数传递#1.函数名可以被传递#name='jason'#x=name#print(x)#print(id(x))#deffunc():#print('fromfunc')......