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.mfbz.cn/a/691990.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YB2416 SOP8封装30V耐压 低成本3A电流同步降压车充芯片

YB2416 SOP-8 SOP8封装30V耐压 输出电流3A 输出电压可调 输出限流调节 外部线补功能车充IC 过流打隔保护 YB2416A50 SOP-8 30V 3A 固定5V 输出 5%高恒流精度 欠压过流过温保护 YB2416是支持高电压输入的同步降压电源管理芯片&#xff0c;在 4~30V 的宽输入电压范围内可实现3A的…

http和https数据传输与协议区分

目录 1. 数据传输安全性2. 端口号3. URL 前缀4. SSL/TLS 证书5. 性能6. SEO 和用户信任7. 应用场景总结 HTTP&#xff08;HyperText Transfer Protocol&#xff09;和 HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是用于在客户端&#xff08;如浏览器&…

Java基础_异常

Java基础_异常 异常体系介绍编译时异常和运行时异常异常的作用异常的处理方式JVM默认的处理方式自己处理&#xff08;捕获异常&#xff09;try...catch灵魂四问Throwable的成员方法 抛出处理 综合练习自定义异常来源Gitee地址 异常体系介绍 异常是什么&#xff1f; 程序中可能出…

输入偏置电流是什么?

输入失调电流与输入补偿电流概念一样&#xff08;input offset current&#xff09;&#xff1a;同相减去反相输入端偏置电流的差值。这是由生产工艺导致同相与反相端的电流大小方向都会有所不同。 第一种情况&#xff1a;同相输入端减去反相输入端 第一种情况&#xff1a;同相…

windows环境安装多版本jdk与环境切换

1&#xff1a;JDK官网下载 2&#xff1a;安装目录 3&#xff1a;在系统环境变量新添加JAVA_HOME_8和JAVA_HOME_21 4&#xff1a;设置默认使用jdk21&#xff0c;如果需要切换&#xff0c;就更改JAVA_HOME的变量值 5&#xff1a;在环境变量path添加&#xff0c;%JAVA_HOME%\bin和…

Vue3学习第二天记录

Vue3学习第二天记录 背景说明截图记录一个简单的JS文件Vue3的watch()函数Vue3的toRef()/toRefs()函数前端数据类型的分类前端写一个对外暴露的函数前端的...语法Vue3中watch()函数的总结Vue3中watchEffect()函数Vue3中watch()函数的坑Vue3中computed()函数 背景 最近在学习尚硅…

Vue2学习(04)

目录 一、组件的三大组成部分 二、组件的样式冲突scoped 三、scoped原理 ​编辑 四、data是一个函数 五、组件通信 六、props详解 七、非父子通信 1.eventbus事件总线(可以一传多)--->作用是在非父子组件之间&#xff0c;进行简易的消息传递&#xff08;复杂场景---&…

西瓜书总结——决策树原理+ID3决策树的模拟实现

西瓜书总结——决策树原理ID3决策树的模拟实现 前言1. 决策树结构2. 决策树的生成&#xff08;注意区分属性和类别&#xff09;3. 划分选择3.1 信息熵和信息增益3.2 增益率3.3 基尼指数&#xff08;鸡你指数&#xff09; 4. 剪枝处理4.1 预剪枝4.2 后剪枝 5. 连续值与缺失值处理…

获取东方财富网股票的实时数据股票的数据,并保存到Excel文件中

可以运行python文件获取东方财富网:【序号,代码,名称,最新价,涨跌幅,涨跌额,成交量,成交额,振幅,最高,最低,今开,昨收,量比,换手率,市盈率-动态,市净率,总市值,流通市值,涨速,5分钟涨跌,60日涨跌幅,年初至今涨跌幅,】数据,保存到Excel文件中。 import pandas as pd import re…

使用 Ollama 和 Open WebUI 自托管 LLM 聊天机器人(无需 GPU)

✨点击这里✨&#xff1a;&#x1f680;原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; 使用 Ollama 和 Open WebUI 自托管 LLM 聊天机器人&#xff08;无需 GPU&#xff09; &#x1f31…

OS复习笔记ch7-3

承接上文我们讲完了页式管理和段式管理&#xff0c;接下来让我们深入讲解一下快表和二级页表 快表 快表和计算机组成原理讲的Cache原理如出一辙。为了减少访存的次数&#xff0c;OS在访问页面的时候创建了快表&#xff08;Translation Lookaside Buffer &#xff0c;简称TLB&…

数字滤波器和模拟滤波器(一)

模拟滤波器和数字滤波器&#xff08;一&#xff09; 下面介绍模拟滤波器和数字滤波器的频率响应的异同&#xff0c;以及如何使用python地scipy.signal来绘制其频谱响应和冲激阶跃响应。在第二期将谈到如何设计模拟滤波器和数字滤波器。 在正文之间&#xff0c;应该介绍连续时…

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(一)

主要帮助大家面向工作过程中Linux系统常用的命令联系&#xff0c;采用极致的实用主义&#xff0c;帮助大家节省时间。 文章目录 前言 一、linux系统 二、linux系统基本命令 1.Linux系统的目录结构 2. 常用命令介绍 3.命令演示 4.作业练习 总结 前言 主要帮助大家面向工作过程中…

【Spring框架全系列】SpringBoot_3种配置文件_yml语法_多环境开发配置_配置文件分类(详细)

文章目录 1.三种配置文件2. yaml语法2.1 yaml语法规则2.2 yaml数组数据2.3 yaml数据读取 3. 多环境开发配置3.1 多环境启动配置3.2 多环境启动命令格式3.3 多环境开发控制 4. 配置文件分类 1.三种配置文件 问题导入 框架常见的配置文件有哪几种形式&#xff1f; 比如&#xf…

接口幂等性设计(5 大方案罗列)

结合案例、列举场景的接口幂等性设计方案。 方案 1. 状态机 业务场景&#xff0c;数据审核成功后进行短信通知&#xff0c;或者是订单状态变成已支付后&#xff0c;短信通知用户订单生成的详细信息&#xff0c;等等和状态有关的操作。 假设 status&#xff1a;0&#xff08;待…

SSL/TLS和HTTPS

HTTPS就是用了TLS包装的Socket进行通信的HTTP 混合加密 被称为混合加密。具体过程如下&#xff1a; 使用非对称加密协商对称密钥&#xff1a; 在通信的开始阶段&#xff0c;通常由客户端和服务器使用非对称加密算法&#xff08;如RSA&#xff09;来协商一个对称密钥。通常情…

Linux日志服务rsyslog深度解析(下)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、rsyslog的核心功能 1、日志消息的收集 2、日志消息的传…

Diffusers代码学习: IP-Adapter

从操作的角度来看&#xff0c;IP-Adapter和图生图是很相似的&#xff0c;都是有一个原始的图片&#xff0c;加上提示词&#xff0c;生成目标图片。但它们的底层实现方式是完全不一样的&#xff0c;我们通过源码解读来看一下。以下是ip adapter的实现方式 # 以下代码为程序运行…

【启程Golang之旅】网络编程与反射

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…

[stm32]——uc/OS-III多任务程序

目录 一、获取uC/OS-III源码 二、移植源代码 &#xff08;1&#xff09;建立工程文件 &#xff08;2&#xff09;移植uC/OS-III源码 &#xff08;3&#xff09;添加工程组件和头文件路径 &#xff08;4&#xff09;添加头文件路径 三、修改代码 总结 一、获取uC/OS-III源码 …