unistd.h中定义的setsid()与fork()

2023-12-16

setsid():是一个UNIX系统调用,用于创建一个新的会话(session)并将当前进程设置为该会话的领头进程(session leader)。通常情况下,setsid() 函数用于创建守护进程(daemon),以确保它与任何终端分离,从而可以在后台独立运行,而不受终端的影响。

1、它创建一个新的会话。

2、将调用进程设置为新会话的领头进程(session leader)。

3、如果调用进程之前是进程组的组长(group leader),那么它会放弃组长地位,以避免接收来自控制终端的信号。

实际就是脱离父进程,自由自在的活着

fork():是一个UNIX和类UNIX系统中的系统调用,用于创建一个新的进程,新进程是调用进程的子进程。fork() 函数的作用是创建一个几乎完全相同的子进程,包括进程的代码、数据和上下文,但子进程拥有自己独立的进程ID(PID)

1、创建新进程: fork() 用于创建一个新的进程,新进程是原进程的副本。这两个进程在调用fork() 之前是完全相同的,但后续它们可以独立运行,执行不同的代码。

2、并发执行: 通常,父进程和子进程会并发运行,即它们可以同时执行不同的代码。这允许在多进程编程中执行并行任务。

3、分支执行: fork() 的典型用例是将一个进程分成两个分支,其中一个分支(子进程)可以执行不同的操作,而另一个分支(父进程)可以执行其他操作。

4、多任务处理: fork() 可用于创建多个进程来处理不同的任务,例如服务器程序可以使用多个进程来同时处理客户端请求。

5、后台任务: 通过fork() 可以创建后台进程,它们在后台独立运行,不受终端会话的影响。

需要注意的是,父进程和子进程之间并不共享内存,它们有各自的内存空间,因此在进程间通信时需要使用专门的IPC(进程间通信)机制,如管道、消息队列、共享内存等。

实例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
pid_t pid;

// Create a child process
pid = fork();

// Check for errors
if (pid < 0) {
    perror("Fork error");
    exit(1);
}

// If we are in the parent process, exit
if (pid > 0) {
    printf("Parent process exiting.\n");
    exit(0);
}

// We are now in the child process
printf("Child process (daemon) started.\n");

// Create a new session and become the session leader
if (setsid() < 0) {
    perror("Setsid error");
    exit(1);
}

// Change the current working directory to root
if (chdir("/") < 0) {
    perror("Chdir error");
    exit(1);
}

// Close standard file descriptors (stdin, stdout, stderr)
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);

// Run as a background daemon
while (1) {
    // Your daemon code goes here
    sleep(1); // For demonstration, sleep for 1 second
}

return 0;

}

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

unistd.h中定义的setsid()与fork() 的相关文章

  • 无法在 Linux 的 NetBeans 中编译 C++ 和 OpenGL (GLFW) 的简单源代码

    我开始学习 OpenGL glfw 我从教程中复制源代码并尝试编译它 但出现了错误 我想我已经正确安装了所有头文件 glm glfw 等 这是我的来源 我没有在头文件中使用这些字符 include iostream include stdi
  • 内核驱动程序从用户空间读取正常,但写回始终为 0

    因此 我正在努力完成内核驱动程序编程 目前我正在尝试在应用程序和内核驱动程序之间构建简单的数据传输 我使用简单的字符设备作为这两者之间的链接 并且我已成功将数据传输到驱动程序 但我无法将有意义的数据返回到用户空间 内核驱动程序如下所示 in
  • 确定 TCP Listen() 队列中当前积压的连接数

    有没有办法找出currentLinux 上 TCP 套接字上等待 Accept 的连接尝试次数 我想我可以在每个事件循环上点击 EWOULDBLOCK 之前计算成功的 Accept 数量 但我使用的是隐藏这些细节的高级库 Python Tw
  • Xvfb 冻结初始化 GLX 扩展

    我正在尝试运行无头 Xvfb 服务器来捕获 Amazon EC2 micro 上的屏幕截图 但它在 GLX 上陷入了困境 我使用此脚本安装了 GLX Xvfb 和所有库 https gist github com joekiller 414
  • Bash:检查是否给出了参数(例如是否有参数“-a”?)

    我有一个脚本 它应该接受 2 个参数 s 和 d 如果未给出 d 参数 我想删除我的调试文件 与 s 相同 如何检查 1 或 2 是否为 s 或 d 舒尔有两个参数 我可以做到 蛮力 if test 1 d test 2 d then rm
  • 找出Linux上一个进程使用了​​多少内存页

    我需要找出进程分配了多少内存页 每个页面是 4096 进程内存使用情况我在查找正确值时遇到一些问题 当我查看 gome system monitor 时 内存映射下有几个值可供选择 Thanks 这样做的目的是将内存使用量除以页数并验证页大
  • 如何从脚本编辑 /etc/sudoers?

    我需要编辑 etc sudoers从脚本中添加 删除白名单中的内容 假设我有一个可以处理普通文件的命令 我如何将其应用到 etc sudoers 我可以复制并修改它 然后有visudo用修改后的副本替换原始版本 通过提供我自己的脚本 EDI
  • 应用程序中两个不同版本的库

    考虑一个场景 其中有两个不同版本的共享库 考虑 A 1 so 链接到 B so A 2 so 链接到 C so 现在 B so 和 C so 都链接到 d exe 当 B so 想要调用 A 1 so 中的函数时 它最终会调用 A 2 so
  • 如何在Linux上用C/C++编写Web服务器[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在考虑在 Linux 平台上开发一个小型 阅读 初级 Web 服务器 但我不知道从哪里开始 我希望它能够做的是 监听特定端口 接受
  • 对于任何真实数据集,数据压缩比的最小可能值是多少

    我在写信ZLIB类似于嵌入式硬件压缩器的 API 它使用 deflate 算法来压缩给定的输入流 在进一步讨论之前 我想解释一下数据压缩率 数据压缩率定义为未压缩大小与压缩大小之间的比率 压缩比通常大于一 这意味着压缩数据通常比未压缩数据小
  • 使用 systemctl 获取 systemd 进程的正常运行时间或停机时间?

    喜欢使用systemctl is active
  • 如何从 Bash 命令行在后台 Vim 打开另一个文件?

    我正在从使用 Gvim 过渡到使用控制台 Vim 我在 Vim 中打开一个文件 然后暂停 Vim 在命令行上运行一些命令 然后想返回到 Vim Ctrl Z 在正常模式下 暂停 Vim 并返回到控制台 fg可用于将焦点返回到 Vim job
  • Docker忽略limits.conf(试图解决“打开文件太多”错误)

    我正在运行一个 Web 服务器 该服务器正在处理数千个并发 Web 套接字连接 为了实现这一点 在 Debian linux 我的基本镜像是 google debian wheezy 在 GCE 上运行 上 打开文件的默认数量设置为 100
  • 如何从 C++ 程序中重新启动 Linux?

    我有一个 Qt 4 GUI 我需要在下拉菜单中提供一个选项 允许用户选择重新启动计算机 我意识到这对于以其他方式重新启动计算机的能力来说似乎是多余的 但选择需要保留在那里 我尝试使用 system 来调用以下内容 suid root she
  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • 在汇编中使用 printf 会导致管道传输时输出为空,但可以在终端上使用

    无输出 https stackoverflow com questions 54507957 printf call from assembly do not print to stdout即使在终端上 当输出不包含换行符时也有相同的原因
  • 如何在 Linux 上通过 FTP 递归下载文件夹 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu

随机推荐

  • SVM原理理解

    目录 概念推导 共识 距离两个点集距离最大的分类直线的泛化能力更好 更能适应复杂数据 怎么能让margin最大 最大化margin公式 求解最大margin值 拉格朗日乘子法 为什么公式中出现求和符号 SVM模型 求解拉格朗日乘子 如何求解
  • 技术面试,如何谈薪资?

    众所周知 程序员是一个很容易出现薪资倒挂的职业 工作 3年比工作 5年薪资高的例子比比皆是 在 你手上有 offer吗 文章中 我们分析了如何巧妙地谈 offer 今天我们一起来分析如何谈薪资 顺利实现薪资倒挂 守住底线 不管是主动换工作还
  • 留给兼容安卓时间不多了!华为原生鸿蒙系统越来越近:跟iOS、安卓一样独立

    前言 据国内媒体报道称 余承东已经明确表态 华为明年将会推出鸿蒙原生应用与原生体验 HarmonyOS NEXT的产品 现在的情况就是 鸿蒙留给兼容安卓生态的时间越来越少了 而在之前已经有不少App厂商转入到他们的生态 并已经在开发相关的A
  • Docker仓库加密认证

    一 强制使用非加密访问仓库 insecure registry 实验环境 准备第二台虚拟机并配置docker服务及开启等 并把文件拷贝到第二台 记得配置好两台虚拟机仓库名的解析 配置步骤 1 配置文件使用非加密端口 vim etc dock
  • 鸿蒙开发入门:快速修复

    快速修复概述 快速修复是HarmonyOS系统提供给开发者的一种技术手段 支持开发者以远快于应用升级的方式对应用程序包进行缺陷修复 和全量应用升级软件版本相比 快速修复的主要优势在小 快和用户体验好 在较短的时间内不中断正在运行的应用的情况
  • Android神兵利器之协程和Lifecycle

    导语 一个安卓开发究竟要经历怎样的颠沛流离才终于能遇见Jetpack 遇见协程和Lifecycle 在Jetpack出现以前安卓应用架构这一块可以说非常混乱 早期没有官方架构组件 小公司可能都是mvc一把梭或者引入了简易版的mvp模式 而大
  • go-zero开发入门之网关往rpc服务传递数据1

    go zero 的网关往 rpc 服务传递数据时 可以使用 headers 但需要注意前缀规则 否则会发现数据传递不过去 或者对方取不到数据 go zero 的网关对服务的调用使用了第三方库 grpcurl 入口函数为 InvokeRPC
  • 30天精通Nodejs--第十三天:MySQL2

    目录 引言 MySQL2简介 使用说明 安装 连接到数据库 连接池 新增 查询 修改 删除
  • 鸿蒙开发入门:应用配置文件概述(一)

    应用配置文件概述 Stage模型 每个应用项目必须在项目的代码目录下加入配置文件 这些配置文件会向编译工具 操作系统和应用市场提供应用的基本信息 在基于Stage模型开发的应用项目代码下 都存在一个app json5及一个或多个module
  • 设置bat工作目录

    在执行bat脚本的时候 如果直接双击bat脚本 此时的工作路径一般为 C Users Administrator gt 很多时候需要将工作路径设置为bat脚本所在的目录 可以在bat脚本内设置当前工作路径为bat文件所在目录 cd d dp
  • 检查网络连通性的几种方法

    检查网络连通性的几种方法 检查网络连通性是确保计算机或设备能够与其他设备或互联网通信的重要步骤 以下是一些用于检查网络连通性的方法 Ping命令 在命令提示符 Windows 或终端 Linux macOS 中 使用ping命令 例如 在W
  • Java面试八股文及答案整理( 2023年 12月最新版,持续更新)

    一 Java 基础 1 JDK 和 JRE 有什么区别 JDK Java Development Kit 的简称 java 开发工具包 提供了 java 的开发环境和运行环境 JRE Java Runtime Environment 的简称
  • 深入理解 Android Activity 启动模式

    在 Android 应用开发中 Activity 是用户界面的核心组件 而 Activity 的启动模式则是决定应用界面如何在任务栈中交互 管理以及呈现的关键因素 正确的启动模式选择能够优化用户体验 提高应用性能 并确保应用在各种情景下都能
  • 各大厂为什么要适配鸿蒙?鸿蒙到底值不值得学

    各大厂为什么要适配鸿蒙 今天在脉脉上看到这个问题 有好多人在下面回复说什么不适配就不爱国之类的话 但是我们仔细想想 这些大厂资本家真的会被这些 不爱国 的舆论影响吗 这些大厂的公关花钱分分钟就能把舆论导向指向其他地方 不然为什么网上那么多黑
  • Centeos安装mysql

    安装mysql 检查MariaDB 因为这个会和MySQL有冲突 所以先检查一下是否有安装 查看mariadb rpm qa grep mariadb 卸载mariadb mariadb libs 5 5 44 2 el7 centos x
  • 规则引擎与商业CRM的完美邂逅:将智能决策融入商业扩展

    一 背景介绍 商业CRM系统的商机模块业务复杂 场景繁多 规则调整频繁 商机流转效率一定程度决定了销售开单的效率 如何高效配合产品侧完成业务规则调整 商机流转经历了硬编码到半配置化的优化升级 过程中遇到了一些问题 也总结了一些经验 今天来和
  • 程序员未来是不是会大量失业?近期分析分享

    程序员未来是不是会大量失业 是的 随着Al的发展恐怕就在这几年 市场环境堪忧 最近两年 也就是从2022年开始 经济下行和行业不景气的情况大家都有目共睹 互联网行业的就业情况越来越不容乐观 头部互联网公司 效益出现了不同程度的下滑 最明显的
  • go-zero开发入门-API服务开发示例

    接口定义 定义 API 接口文件 接口文件 add api 的内容如下 syntax v1 info title API 接口文件示例 desc 演示如何编写 API 接口文件 author 一见 date 2023年12月07日 vers
  • RPA提升电商运营效率!用rpa实现电商主图采集分析

    作为一名经验丰富的文案编辑 经常会面临着许多重复的工作 比如电商主图的采集与分析 通常需要我们手动打开每个商品链接 下载商品主图 然后将其整理成表格 进行分析 这个过程非常繁琐 不仅耗费大量的时间和精力 还容易出错 然而 自从我们开始使用八
  • unistd.h中定义的setsid()与fork()

    setsid 是一个UNIX系统调用 用于创建一个新的会话 session 并将当前进程设置为该会话的领头进程 session leader 通常情况下 setsid 函数用于创建守护进程 daemon 以确保它与任何终端分离 从而可以在后