Day29

本文详细介绍了C语言中`exec`函数系列,包括其用法和原理,以及如何通过`fork`和`system`函数执行shell命令。特别提到了vfork的独特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Day29

创建子进程

exec函数创建一个新进程,用自己的全部地址空间覆盖调用进程的地址空间,但进程的PID不变

exec是一个变身函数集合

#include <unistd.h>

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[]);

参数:

path 字符串首地址,存储可执行程序的路径

file 字符串首地址,存储可执行程序文件名,函数会从环境变量中寻找对应可执行文件

const char* arg,... 可变长命令行参数,用一个或多个字符串首地址形式表达,以空指针结束

char* const argv[] 命令行参数,用字符串数组形式存储表达,以空指针结束

char* const envp[] 为新进程配置的环境参数,用字符串数组形式存储表达,以空指针结束,不指明环境变量则从调用进程复制

返回值:成功不返回,失败返回-1

⭐其他五个函数都是对execve的包装

新进程的创建就是先用fork函数创建子进程,子进程再用exec函数变成一个新进程

旧进程的东西大部分被丢弃,但也有一些属性被新进程继承,比如PID、PPID、实际用户ID、实际组ID、优先级、文件描述符

执行shell命令

#include <stdlib.h>

int system(const char* command);

功能:执行shell命令

参数:commmand shell命令行字符串

返回值:成功返回command进程的终止状态,失败返回-1

⭐若command取NULL,返回非0表示shell可用,返回0表示shell不可用

⭐system函数调用了vfork、exec、waitpid(vfork和fork的区别在于vfork不复制副本而是先共用一块表,但此时父进程不能使用,当子进程有了自己的表,再还给父进程)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值