IO进程线程(七)代码替换函数、守护进程

文章目录

  • 一、代码替换函数
    • (一)system函数
    • (二)exec函数族
  • 二、守护进程
    • (一)创建
      • 1. 脱离父进程影响
      • 2. 脱离原会话组和进程组的影响
      • 3.修改进程工作目录
      • 4. 修改进程创建文件的掩码
      • 5. 关闭从父进程继承的文件描述符
      • 6. 将标准输入、标准输出、标准出错都重定向到文件中
      • 7. 让守护进程随系统启动而启动
    • (二)应用实例

一、代码替换函数

(一)system函数

#include <stdlib.h>int system(const char *command);功能:使用fork创建一个子进程 在子进程中执行shell命令参数:command:要执行的命令字符串  例如:"ls -l"  "./b.out"返回值:如果command为NULL 终端可用返回非0  终端不可用返回0如果子进程创建失败 返回 -1 重置错误码如果命令都执行成功了返回的就是子进程退出的状态值
  • 注:调用system函数时,进程会阻塞等待system函数调用结束后再继续执行
#include <my_head.h>int main(int argc, const char *argv[])
{printf("----start----\n");//执行shell命令system("ls -l");printf("-----end-----\n");return 0;
}

输出结果
在这里插入图片描述

(二)exec函数族

int execl(const char *pathname, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *pathname, const char *arg, ...);
int execv(const char *pathname, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);

二、守护进程

相当于系统的服务,它会随着系统启动而启动,随着系统的终止,脱离了终端

(一)创建

1. 脱离父进程影响

创建子进程,父进程退出
使子进程变成孤儿,被init进程收养

2. 脱离原会话组和进程组的影响

调用setsid来创建新的会话组和进程组

#include <sys/types.h>
#include <unistd.h>
pid_t setsid(void);
功能:如果调用进程不是进程组组长,会创建一个新的会话和进程组调用进程变成新会话和进程组中的唯一进程新的会话id和进程组id  都等于调用进程的pid
参数:无
返回值:成功  新的会话id失败  -1  重置错误码

3.修改进程工作目录

改到一个不会被删除和卸载的目录下

#include <unistd.h>
int chdir(const char *path);
功能:修改进程的工作目录
参数:path:新的目录
返回值:成功  0失败  -1  重置错误码

4. 修改进程创建文件的掩码

控制进程创建的文件的最大权限
每个进程有自己的掩码

#include <sys/types.h>
#include <sys/stat.h>
mode_t umask(mode_t mask);
功能:修改进程创建文件的掩码
参数:mask:新的掩码
返回值:总是会成功 返回之前的掩码

5. 关闭从父进程继承的文件描述符

6. 将标准输入、标准输出、标准出错都重定向到文件中

因为守护进程不应该和终端有关联

#include <unistd.h>
int dup(int oldfd);
功能:重定向文件描述符 将 返回值(遵循最小原则)产生新文件描述符重定向到oldfd中
参数:oldfd:旧的文件描述符
返回值:成功 产生新文件描述符(遵循最小原则)失败 -1 重置错误码#include <unistd.h>
int dup2(int oldfd, int newfd);
功能:将newfd重定向到oldfd中
参数:oldfd:旧的文件描述符newfd:新的文件描述符
返回值:成功 newfd失败 -1 重置错误码

7. 让守护进程随系统启动而启动

如果想让自己的守护进程随着系统的启动而启动
可以 把执行进程的命令 放在系统启动的过程中会执行的脚本中 如 /etc/profile

(二)应用实例

#include <my_head.h>int main(int argc, char const *argv[])
{pid_t pid = 0;//1. 脱离父进程pid = fork();if(-1 == pid){ERR_LOG("pid error");}else if(0 < pid){//父进程exit(0);//退出父进程}else if(0 == pid){//子进程//2. 脱离原来的会话组setsid();//调用进程成为一个新的会话组组长//3. 修改进程的工作目录chdir("/home/linux/");//4. 修改进程创建文件的最大权限umask(0002);//5. 关闭文件描述符for(int i=0;i<1024;i++){close(i);}int log_fd = open("/home/linux/05work/07day/log.txt",O_CREAT|O_APPEND,0666);if(-1 == log_fd) ERR_LOG("open error");//6. 标准输入、标准输出、标准出错都重定向到文件中dup2(log_fd,0);dup2(log_fd,1);dup2(log_fd,2);//开启自己的服务while(1){printf("hello world\n");sleep(1);}return 0;}return 0;
}

在这里插入图片描述
上图可见,该进程的父进程为1号init进程;
依赖终端"?"代表不依赖终端;
进程状态为Ss,休眠态,且是进程组组长;

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

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

相关文章

将stanfordcorenlp的tokenizer换成自定义的(或用stanfordcorenlp对自定义tokenizer分词后的结果做ner)

本文是基于中文语料做的&#xff0c;对于英文语料应该也是同理&#xff0c;即同样适用的。 分析stanfordcorenlp的分词结果&#xff0c;可以发现&#xff0c;它好像是对最小的中文词进行分词&#xff0c;即其对中文的分词粒度很小&#xff0c;这对于某些nlp场景可能就不太合适…

每日一练——相同分数的最大操作数目

3038. 相同分数的最大操作数目 I - 力扣&#xff08;LeetCode&#xff09;相同分数的最大操作数目 I3038. 相同分数的最大操作数目 I - 力扣&#xff08;LeetCode&#xff09; 第一版 int maxOperations(int* nums, int numsSize) {if(numsSize < 1)return 0;int temp 0;…

内存管理--4.用幻灯片讲解内存分配器Allocator

用幻灯片讲解内存分配器Allocators Allocators 内存分配器 提供内存分配策略的通用接口委托给 C 运行时&#xff1a;new / delete使用块内存池管理内存使用不同大小的块内存池管理内存 为什么用分配器? 将容器逻辑与内存分配策略解耦速度&#xff1a;内存分配速度慢确保…

嵌入式学习——Linux高级编程复习(文件IO)——day37

1. 文件IO——&#xff08;无缓存、文件描述符&#xff09; 1.1 定义 文件IO是指文件输入/输出&#xff0c;是计算机程序中用于读取和写入文件的操作。通过文件IO&#xff0c;程序可以从文件中读取数据到内存中&#xff0c;或者将内存中的数据写入文件中&#xff0c;文件可以是…

Python3 笔记:字符串的 startswith() 和 endswith()

1、startswith() 方法用于检查字符串是否是以指定子字符串开头&#xff0c;如果是则返回 True&#xff0c;否则返回 False。如果参数 beg 和 end 指定了值&#xff0c;则在指定范围内检查。 语法&#xff1a;str.startswith(substr, beg0,endlen(string)) 参数&#xff1a; s…

华为OD技术面试-最长回文串-2024手撕代码真题

题目:最长回文串 给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的 回文串 的长度。 在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。 示例 1: 输入:s = "abccccdd" 输出:7 解释: 我们可以构造的最…

基于51单片机水塔水位控制系统

基于51单片机水塔水位控制 &#xff08;仿真&#xff0b;程序&#xff09; 功能介绍 具体功能&#xff1a; 1.用滑动变阻器模拟水位&#xff0c;ADC0809将模拟信号转换为数字信号&#xff1b; 2.LCD1602显示当前水位和水位阈值&#xff1b; 3.当水位超过设定阈值&#xff…

MySQL基础_10.约束

文章目录 第一章、约束1.1 约束的定义1.2 非空约束1.3 唯一性约束1.4 主键约束1.5 自增列1.6 外键约束1.7 CHECK约束1.8 DEFAULT约束 第一章、约束 1.1 约束的定义 约束是对表中字段的限制。 约束按照作用范围可以分为&#xff1a;列级约束和表级约束 列级约束&#xff1a;声…

【二进制部署k8s-1.29.4】十二、ingress-nginx的安装部署

文章目录 简介 一.ingress的安装一.验证安装 简介 本章节主要讲解安装ingress-nginx-v1.10.1的安装&#xff0c;ingress的安装比较简单&#xff0c;只需要下载yaml文件&#xff0c;修改一下镜像地址&#xff0c;原本的镜像地址由于墙的原因&#xff0c;没法直接下载&#xff0c…

C++网络编程——多路IO复用 重点epoll

前言补充 阻塞与非阻塞 同步阻塞IO &#xff08;Blocking IO) : 传统IO模型 同步非阻塞IO &#xff08;Non-blocking IO)&#xff1a; 默认创建的socket都是阻塞的&#xff0c;若是要设置成非阻塞IO需要socket被设置成NONBLOCK。 IO多路复用&#xff08;IO Multiplexing&…

微软 Windows 10 22H2 发布可选更新 19045.4474,修复窗口显示问题等

微软今天面向 Windows 10 22H2 版本&#xff0c;发布了 KB5037849 非安全可选更新&#xff0c;用户安装后版本号升至 Build 19045.4474。 IT之家 5 月 30 日消息&#xff0c;微软今天面向 Windows 10 22H2 版本&#xff0c;发布了 KB5037849 非安全可选更新&#xff0c;用户安…

内部资料13000+变现资源,写作副业项目,找灵感就用它!

很多刚学在公众号&#xff0c;或是在其他自媒体平台写副业项目的朋友&#xff0c;写一段时间后会发现找不到写的内容。于是&#xff0c;每天都会为写什么而苦恼&#xff0c;找不到素材&#xff0c;没有灵感。 关注富哥资源站的朋友都知道&#xff0c;咱们的资源站已经更新了内…

2024 Jiangsu Collegiate Programming Contest E. Divide 题解 主席树

Divide 题目描述 Given an integer sequence a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1​,a2​,…,an​ of length n n n. For an interval a l , … , a r a_l,\ldots,a_r al​,…,ar​ in this sequence, a Reduce operation divides the maximum value of the inter…

【NI国产替代】产线测试:数字万用表(DMM),功率分析仪,支持定制

数字万用表&#xff08;DMM&#xff09; • 6 位数字表显示 • 24 位分辨率 • 5S/s-250KS/s 采样率 • 电源和数字 I/O 均采用隔离抗噪技术 • 电压、电流、电阻、电感、电容的高精度测量 • 二极管/三极管测试 功率分析仪 0.8V-14V 的可调输出电压&#xff0c;最大连…

[Cloud Networking] Layer Protocol (continue)

文章目录 1. STP / RSTP / MSTP Protocol1.1 STP的作用1.2 STP 生成树算法的三个步骤1.3 STP缺点 2. ARP Protocol3. DHCP Protocol3.1 DHCP 三种分配方式3.2 DHCP 攻击 4. IPSEC / MACSEC 1. STP / RSTP / MSTP Protocol 1.1 STP的作用 消除二层环路&#xff1a;通过阻断冗余…

shell脚本基础教程

快捷目录 1、解释器2、shell脚本调用方式3、变量自定义变量环境变量特殊变量变量的默认值declare 命令readonly命令let命令 4、数据类型字符串 5、字符串操作6、数组定义数组读取数组修改数组删除数组获取数组长度 7、运算符算术运算符关系运算符布尔运算符逻辑运算符 要在[[ ]…

求极差(range)

题目描述 小红拿到了一个数组&#xff0c;其中每个元素都是素数。小红准备进行若干次以下操作&#xff1a; 选择两个素数元素&#xff0c;将他们合并&#xff0c;生成的新元素为原来两个素数的乘积。 现在小红希望操作到不能再操作为止&#xff0c;然后使得最终的极差&#…

王道408数据结构CH4_串

概述 4 串 4.1 串的实现 4.1.1 存储结构 定长顺序存储 #define Maxsize 255typedef struct{char *ch[Maxsize];int length; }SString;堆分配存储 typedef struct{char *ch;int length; }HString;块链存储 4.1.2 基本操作 4.2 模式匹配&#xff08;子串定位&#xff09; 4.2.…

Docker面试整理-Docker Swarm是什么?

Docker Swarm 是 Docker 的原生集群管理和编排工具,用于将多个 Docker 主机集合成一个虚拟的 Docker 主机。它允许你在多台机器上部署、管理和扩展容器化应用,是构建和管理容器化应用的高可用集群的一种方式。 Docker Swarm 的核心特性包括: 1. 集群管理: ● Docker Swarm…

RaspAP:轻松实现树莓派无线 AP

RaspAP 是一个可以将树莓派轻松部署成无线 AP&#xff08;Access Point&#xff09;的软件方案&#xff0c;具有一套响应式的 WebUI 来控制 WiFi&#xff0c;用起来和家用路由器一样方便。RaspAP 可以运行在 Raspbian 上&#xff0c;只需要先给树莓派安装好 Raspbian 系统&…