学习目标:学习使用exec函数族的重要的几个函数


 一、引言

进程通过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()

 #include <stdio.h>
#include <unistd.h> int main(void)
{
pid_t pid = fork(); if (pid == ) {
execl("/work/material/linux-系统编程/day01/4-源代码/01_process_test/exec/output", "output", NULL);
} else if (pid > ) {
printf("i'm parent pid = %d\n", getpid());
sleep();
} return ;
}

2) execlp()

 #include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
char *argvv[] = {"ls", "-l", "-F", "R", "-a", NULL};
pid_t pid = fork();
if (pid == ) {
execlp("ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL);
//********下面不再运行***********//
execl("/bin/ls", "ls", "-l", "-F", "-a", NULL);
printf("I am child\n");
execv("/bin/ls", argvv);
perror("execlp");
exit();
} else if (pid > ) {
sleep();
printf("I am parent\n");
}
return ;
}

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

2.3 进程控制之exec函数族的更多相关文章

  1. 进程控制之exec函数

    用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序.当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行.因为调用exec并不创 ...

  2. Linux进程实践(3) --进程终止与exec函数族

    进程的几种终止方式 (1)正常退出 从main函数返回[return] 调用exit 调用_exit/_Exit (2)异常退出 调用abort   产生SIGABOUT信号 由信号终止  Ctrl+ ...

  3. UNIX环境编程学习笔记(20)——进程管理之exec 函数族

    lienhua342014-10-07 在文档“进程控制三部曲”中,我们提到 fork 函数创建子进程之后,通常都会调用 exec 函数来执行一个新程序.调用 exec 函数之后,该进程就将执行的程序 ...

  4. Linux系统编程——进程替换:exec 函数族

    在 Windows 平台下,我们能够通过双击运行可运行程序,让这个可运行程序成为一个进程.而在 Linux 平台.我们能够通过 ./ 运行,让一个可运行程序成为一个进程. 可是.假设我们本来就执行着一 ...

  5. 1.2 Linux中的进程 --- fork、vfork、exec函数族、进程退出方式、守护进程等分析

    fork和vfork分析: 在fork还没有实现copy on write之前,Unix设计者很关心fork之后立即执行exec所造成的地址空间浪费,也就是拷贝进程地址空间时的效率问题,所以引入vfo ...

  6. Linux进程控制——exec函数族

    原文:http://www.cnblogs.com/hnrainll/archive/2011/07/23/2114854.html 1.简介 在Linux中,并不存在exec()函数,exec指的是 ...

  7. exec函数族,守护进程,线程同步和互斥

    2015.3.2 进程和程序有三点不同:1,存在位置不同,程序:硬盘,磁盘.进程:内存2. 程序是静态的,进程是动态的 执行./a.out -->bash->bash程序调用fork()- ...

  8. Linux进程理解与实践(三)进程终止函数和exec函数族的使用

    进程的几种终止方式(Termination) (1)正常退出 从main函数返回[return] 调用exit 调用_exit或者_Exit 最后一个线程从其启动处返回 从最后一个线程调用pthrea ...

  9. 【linux草鞋应用编程系列】_2_ 环境变量和进程控制

    一. 环境变量     应用程序在执行的时候,可能需要获取系统的环境变量,从而执行一些相应的操作.     在linux中有两种方法获取环境变量,分述如下.   1.通过main函数的参数获取环境变量 ...

随机推荐

  1. latex在线编辑网址

    https://www.overleaf.com/7876326cfzygjtvbrzh#/27713363/

  2. Java IO 整理总结

    read(byte b[], int off, int len) 方法的作用是从输入流中读取 len 个字节,并把数据写入到字节数组b中,并返回实际读取了多少数据.如果没有读取到任何数据,意味着文件已 ...

  3. Selenium2学习(十一)-- select下拉框

    本篇以百度设置下拉选项框为案例,详细介绍select下拉框相关的操作方法. 一.认识select    1.打开百度-设置-搜索设置界面,如下图所示 2.箭头所指位置,就是select选项框,打开页面 ...

  4. php nginx 获取header信息

    nginx中可能没有getallheaders函数 因此编写新函数 function NginxGetAllHeaders(){//获取请求头 $headers = []; foreach ($_SE ...

  5. April 1 2017 Week 13 Saturday

    There is more to life than increasing its speed. 生活不仅仅是匆匆赶路. Get a life, a real life, not a manic pu ...

  6. 一点一点学写Makefile(4) - 编译时指定宏参数

    我们在项目中有时为了方便会自定义一些与项目无关的功能,例如打印输出一些提示信息.将关键协议生成文件等,但是如果每次都通过修改代码的方法来实现,测试部门就会认为你改的这些代码可能会带来其他问题.对于这种 ...

  7. selenium启动不了浏览器或者启动后不会写入网址,先更新下浏览器驱动

    平时自动化习惯用Chrome浏览器.有几个月没用selenium启动IE和Firefox,今天跑兼容性测试,需要验证其他浏览器.结果遇到两个异常: 1 IE启动不了,直接报错. 2 Firefox启动 ...

  8. 【转】ssh timed out 超时解决方案

    转自:http://www.cnblogs.com/niutouzdq/p/4091268.html 在使用阿里云ECS服务器的时候,winsftp经常被服务器断开,想必是过一会没有操作,防火墙喜欢对 ...

  9. 关于自学C语言这件事

    说在前面 为什么会写下这篇文章?本人也并不是什么大神,但是也自学了很久,从一个小白开始自学,期间走过很多弯路,掉过许多坑.一路跌跌撞撞下来,算是有了点收获,有了点感想,将它们记录下来,希望能帮助新入坑 ...

  10. BZOJ3437:小P的牧场(斜率优化DP)

    Description 小P在MC里有n个牧场,自西向东呈一字形排列(自西向东用1…n编号),于是他就烦恼了:为了控制这n个牧场,他需要在某些牧场上面建立控制站,每个牧场上只能建立一个控制站,每个控制 ...