当前位置: 首页 > news >正文

Linux操作系统:fork+exec进程创建

进程创建

执行了3次ps -f,ps -f的父进程的ID(PPID)都是一样的,也就是bash

实际上Linux上这个bash就是不断的复制自身,然后把复制出来的用exec替换成想要执行的程序

运行ps,发现ps是bash的一个子进程,原因就是bash把自己复制了一份,然后替换成了ps 

 

替换,这里就体现了写时拷贝的意义,如果全部都要替换,那么最开始的复制是没有意义的;

注意,用了写时拷贝就支付值了几个页表的银蛇,内容还没有复制,然后执行了替换exec

在Linux中 新的进程的产生过程(进程创建):

fork(复制进程)

exec系列:将当前进程替换为另一个进程

 进程替换exec系列

execl,execlp,execle,execv,execvp//库函数

execve//系统调用

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{printf("main pid=%d\n",getpid());execl("/usr/bin/ps","ps","-f",(char *)0);exit(0);
}

 execl:只是将原来的程序换成了ps程序,但是PCB并没有变化,但是PCB里面的有些值被修改了,比如PCB中程序的名字换成了新程序的名字;

新的进程从主函数的第一行开始执行,也就是ps程序的主函数的第一行代码开始执行,这个和fork方法不一样,fork返回以后,从fork所在位置开始执行;

所以直接在execl下面打印一个失败,如果成功就根本不会执行到这里;

printf("execl error\n");

剩余exec系列:

execlp("ps","ps","-f",(char *)0);//int main(int argc,char *argv[],char *envp[])
execle("/usr/bin/ps","ps","-f",(char *)0,envp);//int main(int argc,char *argv[],char *envp[])
char *myargv[]={"ps","-f",0};
execv("/usr/bin/ps",myargv);//int main(int argc,char *argv[],char *envp[])
char *myargv[]={"ps","-f",0};
execvp("ps",myargv);int execve(const char * path, char* const argv[],char* const envp[]); //系统调用
//int main(int argc,char *argv[],char *envp[])char *myargv[]={"ps","-f",0};
execve("/usr/bin/ps",myargv,envp);

进程创建演示:

(1)创建ps命令-execl的使用

exec系列单独是能使用的,但是没有多大意义。通常我们会结合fork一起使用;

fork+exec()是Linux上创建新进程的方式;

 #include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<assert.h>#include<wait.h>int main()
{printf("main pid=%d,ppid=%d\n",getpid(),getppid());pid_t pid=fork();assert(pid!=-1);if(pid==0){printf("child pid=%d,ppid=%d\n",getpid(),getppid());// execl("/bin/ps","-f",(char *)0);//省略了ps也对,但是最好写成上面的;execl("/usr/bin/ps","ps","-f",NULL);printf("execl error");exit(0);}wait(NULL);exit(0);}

 

相关文章:

  • 如果教材这样讲--碳膜电阻、金属氧化膜电阻、金属膜电阻、保险丝电阻、绕线电阻的区别和用途
  • Docker 与微服务架构:从单体应用到容器化微服务的迁移实践
  • 微软全新开源的Agentic Web网络项目:NLWeb,到底是什么 ?
  • 2024-2025年AI领域重大事件深度解析:技术革命、产业重构与未来挑战
  • 机器学习与深度学习算法:从决策树到 GAN 的原理与 PyTorch 实现
  • 升级node@22后运行npm install报错 distutils not found
  • leetcode 83和84 Remove Duplicates from Sorted List 和leetcode 1836
  • 微服务的应用案例
  • JMeter-Websocket接口自动化
  • C++23中std::span和std::basic_string_view可平凡复制提案解析
  • SpringBoot的前世今生
  • 学习STC51单片机11(芯片为STC89C52RC)
  • 使用VLOOKUP查询两个表格,使用数字格式进行查询,如果返回NA错误,则使用文本格式进行查询
  • 实战:Dify智能体+Java=自动化运营工具!
  • 1 研发规划
  • java基础(方法)
  • Spring Boot——自动配置
  • PL/Python数据库: PostgreSQL Python扩展
  • 2025最新版Visual Studio Code for Mac安装使用指南
  • 代码走读 Go 语言 Map 的实现
  • 网站制作哪些公司制作/怎么找推广渠道
  • 简阳建设网站公司/网页优化seo公司
  • 做塑料哪个网站好/惠州seo排名
  • 电子商务网站建设的目的是开展网络营销/网站seo搜索
  • 青海网站制作的公司/东莞做网站排名优化推广
  • 做网站怎么留接口/成都网站seo收费标准