linux进程控制函数--fork,exec,exit,wait,sleep

2023-05-16

1.fork

在linux系统中,用户创建进程的唯一方法就是使用系统调用fork,大概要进行下面的操作。

<1>.分配表项,一个用户的进程项是有限的;

<2>.创建子进程的进程标识号;

<3>.复制父进程中的项目给子进程;

<4>.与父进程相连的文件表和索引值加1,与子进程相连;

<5>.内核为子进程创建用户级上下文;

<6>.生成进程的动态部分。

#include <sys/types.h>

#include <unistd.h>

pid_t fork(void);

return:调用成功,对父进程返回子进程的PID,对子进程返回-1;调用失败,返回-1至父进程。

fork函数最重要的就是返回值,非常特殊,返回两个值,分别给父进程和子进程,在fork创建进程时起到至关重要的地方。


2.exec

这个函数最大的作用在于可以取代调用进程的内容,也是linux可以执行新程序的关键。当fork完后调用exec便会进行新进程的进行,这也是为何fork复制出来的子进程执行之后与父进程不一样的根本原因所在。这里还有个“copy-on-write”的技术,提高进程的效率的。

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,const char *argv[]);

int execvp(const char *file,const char *argv[]);

int execve(const char *path,const char *argv[],char *const envp[]); //真正意义上的调用函数

除了execlp,execvp之外,其他四个函数必须是一个完整的path

envp存放的是环境变量,何为环境变量?简单来说,就是一组用来确定应用程序在系统中一些细节的值,一般以“XXX=xxx”形式存在。还有一点要注意的是凡是数组都是以NULL结尾。


3.exit

简单一点说,exit函数就是进程结束函数,就是一个进程结束的标识。

这里还要提到一个_exit函数,主要区别在于在linux中的库函数原型不一样,exit()定义在stdlib.h中,_exit定义在unistd.h中。

这里用一句话说明区别,它们都是写入内存,但_exit只有在满足特点条件下才能写入文件,如何要保存数据的完整性,一般使用exit函数。


4.wait

总结了wait的5个知识点:

<1>.僵尸进程:在一个进程调用了exit之后,该进程并非马上消失还留下一些参与的信息

<2>.用wait结束僵尸进程.

 #include <sys/types.h>

#include <sys/wait.h>

pid_t wait (int *stutas)

原理:进程一旦调用了wait,就立即阻塞自己,当分析到当前进程的子进程已经exit,便会收集这个子进程的信息,然后彻底销毁,如果没有找到这样的子进程,就会一直阻塞在这里,直到有一个出现。

<3>.参数status

在wait中,这是一个指向一个整型数据的指针,用来存放子进程退出时的状态,后来又定义了一个WIFEXITED(status)的宏来完成这项工作,这里的status就是一个指针指向的整数。

<4>进程同步。wait可以解决进程的同步问题,通过wait(&status)语句在父进程中等待子进程的返回值。



通过time可以看到父子进程的执行状态,在sleep的5秒中内,此时父进程一直等待子进程的返回值。

<5>waitpid函数。其实,wait是waitpid的包装后的形式。waitpid有三个参数(pid,*status,options)

pid>0,只等待PID=pid的子进程;=0,等待同一进程组中的任何子进程;=-1,等待任何子进程退出,此时=wait;<-1,等待指定进程组中的任何子进程

options:WNOHANG|WUNTRACED,也可设为0,此时=wait。

返回值:1.正常返回子进程的PID;2.若设置了WNOHANG,可能返回0;3.error,返回-1。


5.sleep

就是挂起进程指定的秒数,时间到了返回0。


当然除了这些进程的基本操作以外,还有一些特殊操作。比如,setuid和setgid,setpgrp和setpgid设置进程组ID,chdir修改指定的目录,chroot修改根目录,nice修改权限等等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux进程控制函数--fork,exec,exit,wait,sleep 的相关文章

随机推荐

  • 【cpprestsdk】浅谈cpprestsdk线程池及使用

    cpprestsdk根据include文件夹可以看到共包含两部分内容 xff1a 1 pplx 2 cpprest pplx threadpool h源代码中创建线程池有两种方式 1 通过construct接口创建 xff0c 返回一个un
  • 丹尼带你入坑无人机3 - 四轴配件简介

    知道你的四轴里面每个小东东都是干嘛用的吗 xff1f 麻雀虽小 xff0c 五脏得全 简单说 xff0c 飞控就是大脑 xff0c 它能知道每一时刻无人机的状态 xff0c 并且给下一时刻需要作出的动作发出指令 电调就好比是神经单元 xff
  • Linux内核简单分析(2)——进程调度与切换

    进程的调度与切换是一个很复杂的话题 xff0c 这里我更关心内核是如何实现的 xff0c 而不是使用了什么策略 xff0c 所以只讲进程的组织和切换方式 xff0c 而对调度程序的实现和算法不作分析 进程调度可参考 xff1a Linux进
  • 【矩阵路径】不知道回溯怎么写?进来看模板就对了!

    矩阵路径 不知道回溯怎么写 xff1f 进来看模板就对了 xff01 这几天做了几道回溯算法的题目 xff0c 发现理解递归关键步骤的结果很重要 xff0c 试图摸索出一套模板 xff0c 思考的方法都是搭建好框架 xff0c 然后逐步细想
  • gloox 获取花名册和联系人出席信息

    gloox 之 RosterManager 此类实现了jabber iq roster名空间中的Jabber XMPP花名册操作 它继承了 IqHandler PresenceHandler SubscriptionHandler 和 Pr
  • TCP/IP网络编程笔记--套接字和标准I/O

    一 定义 xff1a 标准I O是标准C库提供的对文件操作的函数接口 二 常见的标准I O函数 xff1a 1 fopen xff08 xff09 函数原型 xff1a FILE fopen xff08 const char path xf
  • C语言位运算符:与、或、异或、取反、左移和右移

    文章转载于 博客园 博主 夜真寒 链接地址 xff1a http www cnblogs com yezhenhan archive 2011 11 06 2238452 html 语言位运算符 xff1a 与 或 异或 取反 左移和右移
  • Linux系统之常用命令

    这几天在看教学视频 xff0c 里面在讲一些linux系统常用的命令 xff0c 虽然有一部分都很熟悉了 xff0c 但也有一些不太熟悉 xff0c 因此来总结一下 注 xff1a 本文并非介绍了linux下所有常用的命令 xff0c 而是
  • C++学习笔记--尽量以const,enum,inline替换#define

    本文内容整理自 Effective C 43 43 中文版 xff0c 主要讲述 C 43 43 中在一些场合使用 const enum inline 来替换 define 所带来的好处 1 const 当我们编写这样一条代码 xff1a
  • ROS分布式通信(可以查看话题但主机接受不到从机传输的消息)

    提示 xff1a 想要将nano上的传感器数据发回pc端从机进行计算 xff0c 但是pc端计算完后发布话题 xff0c nano上的主机可以查看到这个话题但却收不到消息 xff08 已经在主机配置好相应的消息类型 xff09 前言 提示
  • 用户身份认证

    0 背景 计算机本身无法判断坐在显示器前的使用者的身份 xff0c 也无法确认网络的另一端的是谁 为了明确是谁在访问服务器 xff0c 必须让客户端自报家门 通常核对一些登录者本人的信息 xff1a 密码 xff1a 只有本人知道的字符串信
  • 一款用过就舍不得换的播放器-potplayer(中文绿色版)/win64

    PotPlayer 是 KMPlayer 的原制作者姜龙喜先生 xff08 韩国 xff09 进入 Daum 公司后的新一代网络播放器 PotPlayer 的优势在于强大的内置解码器 xff1b 而 KMPlayer 的优势在于强大的定制能
  • (一) odroid-xu4交叉编译过程

    目录 文章目录 目录前言Toolchain安装过程总结 前言 现在转到ODROID xu4的平台 xff0c 需要安装ODROID xu4的交叉编译环境 xff0c 特此记录 xff01 本文参照ODROID Wiki Toolchain安
  • 使用OPENMV控制云台自动追踪Apriltag,测出与Apriltag距离并且通过串口发送给单片机。

    使用openmv控制云台自动跟踪Apriltag xff0c 并且将openmv与Apriltag距离通过串口发送到单片机 如果有openmv的同学直接将main py和pid py复制到flash中就可以了 注意 xff01 Aprilt
  • ubuntu 配置http

    1 去服务器上购买免费https服务并配置域名等 2 根据自己的网站服务器来选择下载不同的ssl证书 apache证书包括 1 root bundle crt 证书文件 2 xxx xxx xxx crt 证书文件 3 xxx xxx xx
  • C++中istringstream、ostringstream、stringstream详细介绍和使用

    C 43 43 中istringstream ostringstream stringstream介绍和使用 1 基于控制台的I O 注意 xff1a 提取符 34 gt gt 从流中提取数据时跳过输入流中的空格 tab键 换行符等空白字符
  • java httpClient Digest Auth 认证

    技术交流QQ群 933925017 java httpClient Digest Auth 认证 因为项目需要 请求海康摄像头 进行抓图以及云台控制等功能 海康有http协议 但是需要进行请求头认证 因为海康给的资料已经过时 所以找了很久
  • 锂电池充电过程及电路设计

    通常为了提高电池充电时的可靠性和稳定性 xff0c 我们会用电源管理芯片来控制电池充电的电压与电流 xff0c 但是在使用电源管理芯片设计充电电路时 xff0c 我们往往对充电电路每个时间段的工作状态及电路设计注意事项存在一些困惑 1 电池
  • 0Ω电阻到底能过多大电流

    0 电阻到底能过多大电流 xff1f 这个问题想必每位硬件工程师都查过 而与之相关的还有一个问题 xff0c 那就是0 电阻的阻值到底有多大 xff1f 这两个问题本来是很简单的 xff0c 答案应该也是很明确的 xff0c 但网上网友却给
  • linux进程控制函数--fork,exec,exit,wait,sleep

    1 fork 在linux系统中 xff0c 用户创建进程的唯一方法就是使用系统调用fork xff0c 大概要进行下面的操作 lt 1 gt 分配表项 xff0c 一个用户的进程项是有限的 xff1b lt 2 gt 创建子进程的进程标识