1. 进程替换?

    父子进程之间是共享代码的,那么如果希望子进程去执行其它函数,而不是父进程的代码
    完成这样的操作:需要使用到exec函数族,去执行另外一个程序,进程调用exec函数时,进程的

用户空间代码和数据会完全被新的程序代替,这并没有去创建新的进程,而是代码段和数据段的替换

2.函数如下:

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ...,char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);

其中: l:list | p:path | e:env

  1. 挨个介绍:

#include<stdio.h>
#include<unistd.h>//01.int execl(const char *path, const char *arg, ...);
int main(){printf("替换函数之前\n");execl("/bin/ls","ls","-a","-l",NULL);printf("替换函数之后\n");return 0;
}替换函数之前
total 44
drwxrwxr-x  2 ubuntu ubuntu  4096 May  4 01:17 .
drwxrwxr-x 11 ubuntu ubuntu  4096 May  4 00:44 ..
-rwxrwxr-x  1 ubuntu ubuntu 10920 May  4 01:17 exec
-rw-rw-r--  1 ubuntu ubuntu   254 May  4 01:17 exec.c
-rwxrwxr-x  1 ubuntu ubuntu 11032 May  4 00:50 exit
-rw-r--r--  1 ubuntu ubuntu   170 May  4 00:50 exit.c
-rw-r--r--  1 ubuntu ubuntu   225 May  4 00:17 makefile
可以看到后面那个printf并没有打印出来,是因为替换了新的代码段,所以执行不到而且是没有返回值的,一旦失败就不去执行了//04 int execv(const char *path, char *const argv[]);
int main(){printf("替换函数之前\n");char *argv[] = {"ls","-a","-l",NULL};execv("/bin/ls",argv);printf("替换函数之后\n");return 0;
}
ubuntu@VM-0-17-ubuntu:~/linuxTest/sys_linux/csdn$ ./exec
替换函数之前
total 44
drwxrwxr-x  2 ubuntu ubuntu  4096 May  4 01:24 .
drwxrwxr-x 11 ubuntu ubuntu  4096 May  4 00:44 ..
-rwxrwxr-x  1 ubuntu ubuntu 11024 May  4 01:24 exec
-rw-rw-r--  1 ubuntu ubuntu   653 May  4 01:24 exec.c
-rwxrwxr-x  1 ubuntu ubuntu 11032 May  4 00:50 exit
-rw-r--r--  1 ubuntu ubuntu   170 May  4 00:50 exit.c
-rw-r--r--  1 ubuntu ubuntu   225 May  4 00:17 makefile//05 int execvp(const char *file, char *const argv[]);
int main(){printf("替换函数之前\n");char *argv[] = {"ls","-a","-l",NULL};execvp("ls",argv);printf("替换函数之后\n");return 0;
}
ubuntu@VM-0-17-ubuntu:~/linuxTest/sys_linux/csdn$ ./exec
替换函数之前
total 44
drwxrwxr-x  2 ubuntu ubuntu  4096 May  4 01:25 .
drwxrwxr-x 11 ubuntu ubuntu  4096 May  4 00:44 ..
-rwxrwxr-x  1 ubuntu ubuntu 11024 May  4 01:25 exec
-rw-rw-r--  1 ubuntu ubuntu   652 May  4 01:25 exec.c
-rwxrwxr-x  1 ubuntu ubuntu 11032 May  4 00:50 exit
-rw-r--r--  1 ubuntu ubuntu   170 May  4 00:50 exit.c
-rw-r--r--  1 ubuntu ubuntu   225 May  4 00:17 makefile//02 int execlp(const char *file, const char *arg, ...);
int main(){printf("替换函数之前\n");execlp("ls","ls","-a","-l",NULL);printf("替换函数之后\n");return 0;
}
ubuntu@VM-0-17-ubuntu:~/linuxTest/sys_linux/csdn$ ./exec
替换函数之前
total 44
drwxrwxr-x  2 ubuntu ubuntu  4096 May  4 01:27 .
drwxrwxr-x 11 ubuntu ubuntu  4096 May  4 00:44 ..
-rwxrwxr-x  1 ubuntu ubuntu 10920 May  4 01:27 exec
-rw-rw-r--  1 ubuntu ubuntu   628 May  4 01:27 exec.c
-rwxrwxr-x  1 ubuntu ubuntu 11032 May  4 00:50 exit
-rw-r--r--  1 ubuntu ubuntu   170 May  4 00:50 exit.c
-rw-r--r--  1 ubuntu ubuntu   225 May  4 00:17 makefile//替换一个自己实现的函数
//int execl(const char *path, const char *arg, ...);
int main(){printf("替换函数之前\n");execl("./exe","exe",NULL);printf("替换函数之后\n");return 0;
}
ubuntu@VM-0-17-ubuntu:~/linuxTest/sys_linux/csdn$ ./exec
替换函数之前
exec replace
exec replace
exec replace//自己组装环境变量传递到替换后的代码中
#include<stdio.h>
#include<unistd.h>//03 int execle(const char *path, const char *arg, ...,char *const envp[]);
int main(){printf("替换函数之前\n");char * newenv[] = {"newenv=this_is_new",NULL};execle("./exe","exe",NULL,newenv);printf("替换函数之后\n");return 0;
}#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(){while(1){printf("exec replace\n");sleep(2);printf("newenv:%s\n",getenv("newenv"));}return 0;
}

4.上面介绍的函数均为在系统调用的基础上进行封装的

​​

Linux系统编程 -- exec函数族相关推荐

  1. Linux系统编程——execl函数族

    1.execl函数族介绍 常用的也就是下面这两个: 使进程执行某一程序.成功无返回值,失败返回 -1int execlp(const char *file, const char *arg, ...) ...

  2. 【Linux系统编程】进程替换:exec 函数族

    00. 目录 文章目录 00. 目录 01. exec函数族 02. 参考示例 2.1 execl函数示例 2.2 execv函数示例 2.3 execlp() 或 execvp()函数示例 2.4 ...

  3. 【Linux系统编程学习】Linux进程控制原语(fork、exec函数族、wait)

    此为牛客Linux C++和黑马Linux系统编程课程笔记. 1. fork函数 1.1 fork创建单个子进程 #include<unistd.h> pid_t fork(void); ...

  4. linux系统编程学习_(2)进程控制-- fork函数、exec函数族、回收子进程--孤儿进程僵尸进程、wait函数

    linux系统编程学习_(2)进程控制-- fork函数.exec函数族.回收子进程–孤儿进程僵尸进程.wait函数 进程控制 fork()函数 创建一个子进程. pid_t fork(void); ...

  5. Linux系统编程——进程基础知识

    Linux系统编程--进程基础知识 1.程序和进程 程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu.内存.打开的文件.设备.锁-) 进程,是一个抽象的概念,与操作系统原理联系紧密.进程 ...

  6. 【Linux】一步一步学Linux系统编程教程汇总(暂时暂停更新......)

    00. 目录 文章目录 00. 目录 01. 概述和标准 02. 文件操作 03. 进程概念 04. 进程间通信 05. 多线程 06. 信号 07. 同步与互斥 08. 高级IO 09. 其它 10 ...

  7. Linux系统编程(二)孤儿进程和僵尸进程

    Linux系统编程(二) 一.exec函数族 1.exec函数 二.孤儿进程和僵尸进程 三.wait和waitpid 1.wait函数 2.waitpid函数 一.exec函数族 exec函数使用时, ...

  8. 【Linux | 系统编程】Linux系统编程(文件、进程线程、进程间通信)

    文章目录 Linux系统编程 文件IO open/close函数 read/write函数 文件描述符 阻塞.非阻塞 fcntl函数 lseek函数 传入传出参数 文件系统 文件存储 文件操作 sta ...

  9. Linux系统编程笔记

    文章目录 1.Linux系统编程 2.文件IO 2.1 文件描述符 2.2 open 2.3 perror 2.4 close 2.5 write 2.6 read 2.7 remove 2.8 系统 ...

  10. Linux系统编程总结

    day2 vim的三种工作模式 命令模式 vi hello.c zz 保存退出 2.编辑模式 i a o s (有大写)可以写东西 3.末行模式: 文本和末行模式不能直接切换 要切换回命令模式 再到末 ...

最新文章

  1. 说一说activity
  2. 面试官:如何做 API 接口防刷??
  3. 2021年春季学期-信号与系统-第四次作业参考答案-第八小题
  4. 14.7倍推理加速、18.9倍存储节省!北航、商汤、UCSD提出首个点云二值网络 | ICLR 2021...
  5. 体验Windows Azure的Access Control Service
  6. 英雄联盟诺手又回来了,国服诺手在上单,可谓一夫当关,万夫莫开
  7. 【归并排序】奶牛的图片(jzoj 1812)
  8. 润乾报表不显示的分析原因
  9. godaddy 安装 ssl
  10. php获取银行logo,依据银行卡号获取银行信息php代码
  11. win98万能显卡驱动_万能显卡驱动下载
  12. matlab图像分割(肺实质)
  13. sqlserver2005 安装及SQL 2005 SP3补丁安装详解
  14. Visual Studio 2013各个版本下载地址
  15. 卡西欧科学计算机使用方法,科学计算器的使用方法
  16. php以大写字母分割,js按大写字母拆分字符串
  17. 怎么申请https证书
  18. 略晓网:经验真的能换钱
  19. 三位分节制顺口溜_小学数学顺口溜
  20. mxnet-Gluon(一):mxnet-Gluon 入门

热门文章

  1. Android 视频播放
  2. CSDN 如何删除自己不用的分类(亲测有效!)
  3. mvc5 源码解析2-2 mvchandler的执行
  4. HAOI2011 Problem b 洛谷P2522
  5. 2 创建型模式之 - 工厂模式
  6. 中小型网站集群拓扑图
  7. zabbix 2.4.5 自定义key监控redis
  8. 在xcode6中使用矢量图(iPhone6置配UI)
  9. OpenSessionInViewFilter失效问题
  10. 网络工程师HCIE-RS-layer2(原理+实验)