替换进程exec

这篇博客探讨了如何在C语言中利用execve系统调用来执行外部程序/usr/bin/ps,并传递参数-f。通过示例代码展示了execl、execlp、execle、execv和execve的区别和使用方法。

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

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>

int main(int argc,char*aargv[],char*envp)
{
    char*myargv[10]={"ps","-f"};
    printf("main run pid=%d\n",getpid());
    //execl("/usr/bin/ps","ps","-f",(char*)0);//which ps显示ps所在位置
    //execlp("ps","ps","-f",(char*)0);
    //execle("/usr/bin/ps","ps","-f",(char*)0,envp);
    //execv("/usr/bin/ps",myargv);
    execve("/usr/bin/ps",myargv,envp);//(系统调用)
    printf("execl error");

    exit(0);
}
### 使用 `exec` 函数替换当前进程映像为新程序 在 Linux 中,`exec` 函数族用于将当前进程的用户空间代码和数据完全替换成新的程序。这并不是创建一个新的进程,而是用新程序替代现有进程的内容[^1]。 #### 基本概念 当调用了 `exec` 类函数之一时,当前进程中的原有代码、全局变量以及其他运行时的数据结构都会被清除并由指定的新程序所代替。然而,某些属性会保留下来,比如进程 ID 和已经打开的文件描述符(如果未设置相应的关闭标志)。这意味着即使更换了执行逻辑,依旧可以维持原有的资源连接状态[^2]。 #### 主要形式及其特点 常见的几种 `exec` 形式的声明如下: - **execl**: 参数列表方式传参; - **execv**: 数组指针方式传参; - **execle**: 同时支持参数列表和环境变量数组的方式传参; - **execve**: 支持显式提供路径名以及环境字符串向量的形式; - **execlp**, **execvp**: 自动查找 PATH 环境变量下的命令位置[^3]。 这些变体的主要区别在于传递给目标应用程序的参数格式不同,但最终效果都是相同的 —— 将现有的进程转换成另一个正在运行的应用实例。 #### 实际应用案例 下面给出一段简单的 C 语言代码片段演示如何利用 `fork()` 创建子进程,并通过 `exec` 来让这个子进程加载并启动 `/bin/ls` 工具显示目录内容: ```c #include <unistd.h> #include <stdio.h> int main(void){ int pid; /* Fork a child process */ pid = fork(); if (pid < 0){ // Error occurred fprintf(stderr, "Fork Failed"); return 1; } else if (pid == 0){ // Child Process char *args[]={"ls", "-l", "/tmp", NULL}; printf("Child will execute ls -l /tmp\n"); execvp(args[0], args); // Replace current image with 'ls' perror("Exec failed"); // Only reached on error return 1; // Should never reach here }else{ // Parent Process wait(NULL); puts("Parent done."); } return 0; } ``` 上述例子展示了怎样先生成一个子进程 (`fork`) ,接着在这个子进程中调用 `execvp` 方法来更改其行为模式去执行特定的任务(`ls`). 如果一切顺利的话,则原本应该继续往下走的子线程会被立即中断转而进入全新的上下文中工作[^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值