Linux系统编程 -- exec函数族
进程替换?
父子进程之间是共享代码的,那么如果希望子进程去执行其它函数,而不是父进程的代码
完成这样的操作:需要使用到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
- 挨个介绍:
#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函数族相关推荐
- Linux系统编程——execl函数族
1.execl函数族介绍 常用的也就是下面这两个: 使进程执行某一程序.成功无返回值,失败返回 -1int execlp(const char *file, const char *arg, ...) ...
- 【Linux系统编程】进程替换:exec 函数族
00. 目录 文章目录 00. 目录 01. exec函数族 02. 参考示例 2.1 execl函数示例 2.2 execv函数示例 2.3 execlp() 或 execvp()函数示例 2.4 ...
- 【Linux系统编程学习】Linux进程控制原语(fork、exec函数族、wait)
此为牛客Linux C++和黑马Linux系统编程课程笔记. 1. fork函数 1.1 fork创建单个子进程 #include<unistd.h> pid_t fork(void); ...
- linux系统编程学习_(2)进程控制-- fork函数、exec函数族、回收子进程--孤儿进程僵尸进程、wait函数
linux系统编程学习_(2)进程控制-- fork函数.exec函数族.回收子进程–孤儿进程僵尸进程.wait函数 进程控制 fork()函数 创建一个子进程. pid_t fork(void); ...
- Linux系统编程——进程基础知识
Linux系统编程--进程基础知识 1.程序和进程 程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu.内存.打开的文件.设备.锁-) 进程,是一个抽象的概念,与操作系统原理联系紧密.进程 ...
- 【Linux】一步一步学Linux系统编程教程汇总(暂时暂停更新......)
00. 目录 文章目录 00. 目录 01. 概述和标准 02. 文件操作 03. 进程概念 04. 进程间通信 05. 多线程 06. 信号 07. 同步与互斥 08. 高级IO 09. 其它 10 ...
- Linux系统编程(二)孤儿进程和僵尸进程
Linux系统编程(二) 一.exec函数族 1.exec函数 二.孤儿进程和僵尸进程 三.wait和waitpid 1.wait函数 2.waitpid函数 一.exec函数族 exec函数使用时, ...
- 【Linux | 系统编程】Linux系统编程(文件、进程线程、进程间通信)
文章目录 Linux系统编程 文件IO open/close函数 read/write函数 文件描述符 阻塞.非阻塞 fcntl函数 lseek函数 传入传出参数 文件系统 文件存储 文件操作 sta ...
- 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 系统 ...
- Linux系统编程总结
day2 vim的三种工作模式 命令模式 vi hello.c zz 保存退出 2.编辑模式 i a o s (有大写)可以写东西 3.末行模式: 文本和末行模式不能直接切换 要切换回命令模式 再到末 ...
最新文章
- 说一说activity
- 面试官:如何做 API 接口防刷??
- 2021年春季学期-信号与系统-第四次作业参考答案-第八小题
- 14.7倍推理加速、18.9倍存储节省!北航、商汤、UCSD提出首个点云二值网络 | ICLR 2021...
- 体验Windows Azure的Access Control Service
- 英雄联盟诺手又回来了,国服诺手在上单,可谓一夫当关,万夫莫开
- 【归并排序】奶牛的图片(jzoj 1812)
- 润乾报表不显示的分析原因
- godaddy 安装 ssl
- php获取银行logo,依据银行卡号获取银行信息php代码
- win98万能显卡驱动_万能显卡驱动下载
- matlab图像分割(肺实质)
- sqlserver2005 安装及SQL 2005 SP3补丁安装详解
- Visual Studio 2013各个版本下载地址
- 卡西欧科学计算机使用方法,科学计算器的使用方法
- php以大写字母分割,js按大写字母拆分字符串
- 怎么申请https证书
- 略晓网:经验真的能换钱
- 三位分节制顺口溜_小学数学顺口溜
- mxnet-Gluon(一):mxnet-Gluon 入门