IO进程线程、开启进程frok函数,exec函数族

news2024/11/16 5:29:54

进程是一个独立的可调度的任务

进程是一个抽象实体。当系统在执行某个程序时,分配和释放的各种资源

进程是一个程序的一次执行的过程

主要的进程标识:

进程号(Process Identity Number,PID)

父进程号(Parent Process ID,PPID)

PID唯一地标识一个进程

Linux中的进程包含三个段:

“数据段”存放的是全局变量、常数以及动态数据分配的数据空间(如malloc函数取得的空间)等。

“正文段”存放的是程序中的代码

“堆栈段”存放的是函数的返回地址、函数的参数以及程序中的局部变量

进程的类型:

交互进程:该类进程是由shell控制和运行的。交互进程既可以在前台运行,也可以在后台运行。

批处理进程:该类进程不属于某个终端,它被提交到一个队列中以便顺序执行。

守护进程:该类进程在后台运行。它一般在Linux启动时开始执行,系统关闭时才结束。

进程调度指令:

ps 查看系统中的进程 : ps -aux|grep a.out

top 动态显示系统中的进程: top

nice 按用户指定的优先级运行进程(-20~19): nice -n 2 ./a.out

renice 改变正在运行进程的优先级(-20~19):renice -n 2 pid

kill 向进程发信号:kill -9 pid

bg 将挂起的进程在后台执行(n是挂起的编号):bg [n]

fg 把后台运行的进程放到前台运行(n是挂起的编号):fg [n]

1、进程的系统调用fork

fork创建一个子进程

pid_t fork(void);
返回值:-1,表示失败
       0,表示是子进程
       >0,表示是父进程,但是此刻的返回值代表子进程的pid
       
如果父进程先死亡,此时子进程还存在,那么子进程变为孤儿进程,会后台运行,被init进程收养。
如果子进程先死亡并且父进程存在且未回收子进程资源,那么子进程变成僵尸进程。

        由于之前的fork完整地拷贝了父进程的整个地址空间,因此执行速度是比较慢的。为了提高效率,Unix系统设计者创建了现代unix版的fork。现代unix版的fork也创建新进程,但不产生父进程的副本。它通过允许父子进程可访问相同物理内存从而伪装了对进程地址空间的真实拷贝,当子进程需要改变内存中数据时才拷贝父进程。这就是著名的“写操作时拷贝”(copy-on-write)技术。

2、exec函数族

        exec函数族提供了一种在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段。在执行完之后,原调用进程的内容除了进程号外,其他全部都被替换了。

        可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。

        1、execl:以列表的形式传参

int execl(const char *path, const char *arg, ...);
返回值:-1表示失败
const char *path:要执行程序的路径(包括要执行的文件名)
const char *arg:要执行的文件名
...:不定参数,根据要执行文件的命令行参数确定,最后一定用NULL
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char *argv[])
{ 
    pid_t pid = fork();
    if(-1 == pid){
        perror("fork");
        return -1;
    }else if(0 == pid){
        if(0 != execl("/bin/ls", "ls", "-la", NULL)){
            perror("execl");
            return -1;
        }
        puts("hello");
    }else{
        sleep(1);
    }
    printf("I'm %d\n", getpid());
    return 0;
} 

       2、 execvp:以指针数组的形式传参

int execvp(const char *file, char *const argv[]);
返回值:-1表示失败
const char *file:要执行的文件名
char *const argv[]:执行程序名和参数最后必须NULL

        exec是一个用于在Unix和类Unix操作系统上执行新程序的系列系统调用,它被称为"exec调用族",因为它包括了多个不同的调用,如execl、execv、execle、execve等。这些调用允许进程加载并执行一个新的可执行程序,从而替换当前进程的代码和数据,实现了进程的程序替换。

下面是一些常见的exec调用:

1.execl和execle:这些调用接受可执行程序的路径名和一系列的参数作为参数,然后加载并执行指定的可执行程序。execle还允许在加载新程序时同时指定环境变量。

2.execv和execve:与前面的调用类似,但是参数以数组形式传递,而不是作为单独的参数传递。

3.execvp和execvpe:这些调用与前面的调用类似,但是可以通过搜索PATH环境变量来查找可执行程序的路径,而不需要提供完整的路径。

        通过使用exec调用族,一个进程可以在运行过程中将自己的代码和数据替换为另一个可执行程序,从而实现程序的动态加载和替换。这在各种应用场景中都非常有用,比如在Unix系统中,一个shell进程可以使用exec调用来运行用户输入的命令。

        需要注意的是,exec调用并不会创建新的进程,而只是替换当前进程的代码和数据。如果想要在创建新进程的同时加载新程序,通常会将fork和exec结合使用。首先使用fork创建一个子进程,然后在子进程中使用exec调用加载新程序。这种方式可以实现创建一个新的执行环境,同时保留父进程的状态。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char *argv[])
{ 
    char *buf[] = {"cat", "/1.txt", NULL};
    char cmd[100];
    fgets(cmd, 100, stdin);
    cmd[strlen(cmd)-1] = 0;
    buf[1] = cmd;

    pid_t pid = fork();
    if(-1 == pid){
        perror("fork");
        return -1;
    }else if(0 == pid){
        if(0 != execvp("cat", buf)){
            perror("execl");
            return -1;
        }
        puts("hello");
    }else{
        sleep(1);
    }
    printf("I'm %d\n", getpid());
    return 0;
} 

其他如:execlp、execv

 execlp

#include <stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main(int argc, char *argv[])
{ 
    pid_t pid=fork();
    if(-1==pid){
        perror("fork");
        return -1;
    }
    else if(0==pid)
    {
        if(0!=execlp("ls","ls","-la","/home/hqyj",NULL))
        {   perror("execlp");
            return -1;
        }
    }
    else
    {
        sleep(1);
    }
   return 0;
} 

execv

#include <stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<string.h>
int main(int argc, char *argv[])
{ 
    char *arr1[]={"cat","./execlp.c",NULL};
    char *arr2[]={"ls","-la",".",NULL};
    // char cmd[100]={0};
    // fgets(cmd,100,stdin);
    // cmd[strlen(cmd)-1]='\0';//去除反斜杠n。
    // arr1[1]=cmd;
    pid_t pid=fork();
    if(-1==pid){
        perror("fork");
        return -1;
    }
    else if(0==pid)
    {
        if(0!=execv("/bin/cat",arr1))
        {   perror("execlp");
            return -1;
        }
    }
    else
    {
        sleep(1);
        if(0!=execvp("ls",arr2))
        {   perror("execlp");
            return -1;
        }
    }
   return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/934107.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DML语句的用法(MySQL)

文章目录 前言一、DML介绍二、DML语句操作1、给指定字段添加数据2、给全部字段添加数据3、批量添加数据4、修改数据5、删除数据 总结 前言 本文主要介绍SQL语句中DML语句的用法。 在实验开始之前我们先创建一下所要使用表&#xff0c;如下图所示&#xff1a; 一、DML介绍 DM…

战略在集体学习过程中涌现

战略学习派&#xff1a;战略是涌现的学习过程&#xff0c;中国人的话&#xff0c;要交学习费&#xff01;【安志强趣讲269期】 趣讲大白话&#xff1a;出来混总要交学费 **************************** 中国人有这个意识 新进一个领域&#xff0c;要交学费&#xff0c;有学习过程…

【Flutter】Flutter 使用 infinite_scroll_pagination 实现无限滚动分页

【Flutter】Flutter 使用 infinite_scroll_pagination 实现无限滚动分页 文章目录 一、前言二、安装和基本使用1. 添加依赖2. 基础配置和初始化 三、实际业务中的用法1. 与 API 集成2. 错误处理 四、完整示例1. 创建一个无限滚动列表2. 使用在你的应用中3. 完整代码示例 五、总…

【Qt学习】08:文件读写操作

OVERVIEW 文件读写操作一、文件操作1.QFile2.QFileInfo 二、二进制文件读写三、文本文件读写 文件读写操作 文件操作是应用程序必不可少的部分&#xff0c;Qt 作为一个通用开发库提供了跨平台的文件操作能力。Qt 通过QIODevice提供了对 I/O 设备的抽象&#xff0c;这些设备具有…

Web自动化测试之图文验证码的解决方案

对于web应用程序来讲&#xff0c;处于安全性考虑&#xff0c;在登录的时候&#xff0c;都会设置验证码&#xff0c; 验证码的类型种类繁多&#xff0c;有图片中辨别数字字母的&#xff0c;有点击图片中指定的文字的&#xff0c;也有算术计算结果的&#xff0c;再复杂一点就是滑…

电子封条监控系统 yolov5

电子封条监控系统利用yoloov5python 深度学习训练模型技术&#xff0c;电子封条监控系统实现对画面内外的出入人员、人数变化及非煤矿山生产作业状态等情况的实时监测和分析&#xff0c;及时发现异常动态&#xff0c;减少了人为介入的过程。介绍Yolo算法之前&#xff0c;首先先…

Android开发之性能测试工具Profiler

前言 性能优化问题&#xff0c;在我们开发时都会遇到&#xff0c;但是在小厂和对自己要求不严格的情况下&#xff0c;我都很少去做性能优化&#xff1b; 在性能优化上&#xff0c;基本大家都是通过自己的开发经验和性能分析工具来发现问题&#xff0c;今天给大家分享一下小编最…

性能优化之分库分表

1、什么是分库分表 1.1、分表 将同一个库中的一张表&#xff08;比如SPU表&#xff09;按某种方式&#xff08;垂直拆分、水平拆分&#xff09;拆分成SPU1、SPU2、SPU3、SPU4…等若干张表&#xff0c;如下图所示&#xff1a; 1.2、分库 在表数据不变的情况下&#xff0c;对…

【GeoDa实用技巧100例】025:geoda空间回归分析案例教程

严重声明:本文来自专栏《GeoDa空间计量案例教程100例》,为CSDN博客专家刘一哥GIS原创,原文及专栏地址为:https://blog.csdn.net/lucky51222/category_12373659.html,谢绝转载或爬取!!! 文章目录 一、空间自回归模型二、Geoda空间回归分析普通最小二乘法回归(OLS)空间…

设计模式--建造者模式(Builder Pattern)

一、什么是建造者模式 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它关注如何按照一定的步骤和规则创建复杂对象。建造者模式的主要目的是将一个复杂对象的构建过程与其表示分离&#xff0c;从而使同样的构建过程可以创建不同的表示。…

基于配置类方式管理 Bean

目录 一、完全注解开发理解 二、配置类和扫描注解 三、Bean定义组件 四、Bean注解细节 五、import 扩展 一、完全注解开发理解 Spring 完全注解配置&#xff08;Fully Annotation-based Configuration&#xff09;是指通过 Java配置类 代码来配置 Spring 应用程序&#…

Folyd 多源最短路

目录 简介 实现 代码 关于Floyd的题目 简介 首先我们要知道a到b的最短路是什么 a到b的最短路是从a点到b点的最小距离&#xff08;花费&#xff09; 那多源最短路呢就是能求任意a和b&#xff0c;之间的最短路 那么Folyd是多源最短路&#xff0c;也就是求任意a和b&#x…

春秋云镜 CVE-2019-13275

春秋云镜 CVE-2019-13275 WordPress Plugin wp-statics SQLI 靶标介绍 WordPress VeronaLabs wp-statistics插件12.6.7之前版本中的v1/hit端点存在SQL注入漏洞。 启动场景 漏洞利用 exp time curl -X POST http://host/wp-json/wpstatistics/v1/hit --data "wp_stati…

SpringBoot权限认证

SpringBoot的安全 常用框架&#xff1a;Shrio,SpringSecurity 两个功能&#xff1a; Authentication 认证Authorization 授权 权限&#xff1a; 功能权限访问权限菜单权限 原来用拦截器、过滤器来做&#xff0c;代码较多。现在用框架。 SpringSecurity 只要引入就可以使…

mybatis:动态sql【2】+转义符+缓存

目录 一、动态sql 1.set、if 2.foreach 二、转义符 三、缓存cache 1. 一级缓存 2. 二级缓存 一、动态sql 1.set、if 在update语句中使用set标签&#xff0c;动态更新set后的sql语句&#xff0c;&#xff0c;if作为判断条件。 <update id"updateStuent" pa…

【C++】容器适配器stack、queue以及deque容器

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;C的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录 前言一、什么是容器适配器1.1 stack的…

开源软件的漏洞响应:应对安全威胁

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

岛屿数量00

题目链接 岛屿数量 题目描述 注意点 grid[i][j] 的值为 ‘0’ 或 ‘1’ 解答思路 使用广度优先遍历思想遍历整个岛屿遍历整个二维网络&#xff0c;如果此时位置处的值为1&#xff0c;则当前位置是一个岛的一部分&#xff0c;从该位置向着四个方向遍历出整个岛屿&#xff0…

【滑动窗口】leetcode3:无重复字符的最长子串

一.题目描述 无重复字符的最长子串 二.思路分析 题目要求我们找符合要求的最长子串&#xff0c;要求是不能包含重复字符 确定一个子串只需确定它的左右区间即可&#xff0c;于是我们可以两层循环暴力枚举所有的子串&#xff0c;找到符合要求的&#xff0c;并通过比较得到最长…

5G+智慧交通行业解决方案[46页PPT]

导读&#xff1a;原文《5G智慧交通行业解决方案[46页PPT]》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 喜欢文章&#xff0c;您可以点赞评论转发本文&#xff0c;…