【linuxC语言】vfork、wait与waitpid函数

news2024/10/7 14:29:45

文章目录

  • 前言
  • 一、函数使用
    • 1.1 vfork
    • 1.2 wait
    • 1.3 waitpid
  • 二、示例代码
  • 总结


前言

在Linux系统编程中,vfork()、wait() 和 waitpid() 函数是处理进程管理和控制流的重要工具。这些函数允许我们创建新进程、等待子进程结束并获取其退出状态,从而实现进程间的协作和管理。


一、函数使用

1.1 vfork

原型:

#include <unistd.h>
pid_t vfork(void);

作用:
vfork() 函数创建一个新进程,新进程是调用进程的一个副本,但是在子进程调用 exec() 或 _exit() 之前,子进程执行期间会暂停父进程的执行,因为子进程共享父进程的地址空间。与 fork() 不同的是,vfork() 函数保证子进程先运行,且父子进程共享地址空间,直到子进程调用了 exec() 或 _exit()。
参数:
无参数。
返回值:
如果是子进程,返回0。
如果是父进程,返回子进程的进程ID。
如果发生错误,则返回-1。

1.2 wait

原型:

#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);

作用:
wait() 函数用于等待任何一个子进程结束,并获取其退出状态。调用 wait() 函数会阻塞当前进程,直到任何一个子进程退出为止。
参数:
status:用于存储子进程的退出状态信息的整型指针。
返回值:
如果成功等待到一个子进程结束,返回子进程的进程ID。
如果没有子进程,返回-1,并且设置 errno 为 ECHILD。
如果发生错误,则返回-1。

1.3 waitpid

原型:

#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *status, int options);

作用:
waitpid() 函数提供了更灵活的等待子进程结束的方式。它允许指定要等待的特定子进程的进程ID,并可以选择是否阻塞当前进程。
参数:
pid:指定要等待的子进程的进程ID,可以是:
< -1:等待进程组ID等于 pid 的任一子进程。
-1:等待任一子进程,类似于 wait()。
0:等待与调用进程同一进程组ID的任一子进程。
>0:等待进程ID等于 pid 的子进程。

status:用于存储子进程的退出状态信息的整型指针。
options:用于指定额外选项的整型参数。
返回值:
如果成功等待到一个子进程结束,返回子进程的进程ID。
如果没有子进程,返回0,并且不设置 errno。
如果发生错误,则返回-1,并设置 errno。

二、示例代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main() {
    pid_t pid;
    int status;

    printf("Before vfork\n");

    pid = vfork();

    if (pid == -1) {
        perror("vfork");
        exit(EXIT_FAILURE);
    }

    if (pid == 0) { // Child process
        printf("Child process executing\n");
        sleep(2); // Simulate some work
        printf("Child process exiting\n");
        _exit(EXIT_SUCCESS); // Ensure to exit from child process
    } else { // Parent process
        printf("Parent process executing\n");
        if (waitpid(pid, &status, 0) == -1) {
            perror("waitpid");
            exit(EXIT_FAILURE);
        }
        printf("Parent process continues\n");
    }

    return 0;
}

在这里插入图片描述


总结

在本文中,我们探讨了 vfork()、wait() 和 waitpid() 函数在Linux C语言编程中的应用。

vfork() 函数类似于 fork(),但是与 fork() 不同的是,它在子进程中共享父进程的地址空间,这样可以减少资源消耗。但需要注意的是,在子进程调用 exec() 或 _exit() 之前,父进程会被阻塞,直到子进程结束或调用了其中一个函数。
wait() 函数用于等待任何一个子进程结束,并获取其退出状态。调用 wait() 函数会阻塞当前进程,直到任何一个子进程退出为止。这有助于避免产生僵尸进程,保持系统的稳定性和性能。
waitpid() 函数提供了比 wait() 更加灵活的等待子进程退出的方法。它允许我们指定要等待的特定子进程的进程ID,并可以选择是否阻塞当前进程。这使得我们可以对子进程进行更精确的控制和管理。
综上所述,vfork()、wait() 和 waitpid() 函数在Linux C语言编程中扮演着重要角色,为进程管理和控制提供了强大的工具,使得我们能够更好地管理系统资源,确保程序的正确性和稳定性。

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

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

相关文章

【CAP探索者指南】掌握分布式世界的三角平衡术,一致性、可用性、分区容错性大揭秘!

关注微信公众号 “程序员小胖” 每日技术干货&#xff0c;第一时间送达&#xff01; 引言 在现代的微服务架构中&#xff0c;系统被拆分成了许多小型服务&#xff0c;每个服务可能有自己的数据库。这种架构带来了灵活性和可扩展性&#xff0c;但也引入了新的挑战&#xff0c;…

高质量数据至关重要:phi-1.5论文笔记

导语 phi-系列模型是微软研究团队推出的轻量级人工智能模型&#xff0c;旨在实现“小而精”的目标&#xff0c;能够实现在低功耗设备上例如智能手机和平板电脑上部署运行。截止目前&#xff0c;已经发布到了phi-3模型&#xff0c;本系列博客将沿着最初的phi-1到phi-1.5&#x…

深入浅出 BERT

Transformer 用于学习句子中的长距离依赖关系&#xff0c;同时执行序列到序列的建模。 它通过解决可变长度输入、并行化、梯度消失或爆炸、数据规模巨大等问题&#xff0c;比其他模型表现更好。使用的注意力机制是神经架构的一部分&#xff0c;使其能够动态突出显示输入数据的…

功能测试_分类_用例_方法

总结 测试分类 按阶段分类 是否查看源代码分类 是否运行分类 是否自动化 其他分类 软件质量模型 开发模型-瀑布模型 测试过程模型 v w 测试用例八大要素 用例编号 用例标题 …

DHCPv4_CLIENT_ALLOCATING_07: 发送DHCPDECLINE消息并重新启动配置过程

测试目的&#xff1a; 验证当DOIP客户端检测到分配的IP地址已被使用时&#xff0c;能够发送DHCPDECLINE消息给服务器并重新启动配置过程。 描述&#xff1a; 本测试用例旨在模拟DOIP客户端在接收到DHCP服务器分配的IP地址后&#xff0c;通过地址解析协议&#xff08;ARP&…

华为LTC线索与回款中的线索培育工具:9格构想

在《LTC与铁三角∶从线索到回款-人民邮电.》一书中&#xff0c;说到线索的管理&#xff0c;书中的9格构想不错&#xff0c;收藏之&#xff1a; 九格构想这一工具的使用顺序依次是诊断原因、探究 影响、构想能力。 1. 诊断原因&#xff08; R1-R2-R3 &#xff09; 企业应先用…

Claude聊天机器人推出全新iOS客户端及团队专属计划

Anthropic 正在使其 Claude AI 更易于在移动设备上访问。该公司发布了适用于 iOS 的 Claude 移动应用程序,任何用户都可以免费下载。与聊天机器人的移动网络版本类似,该应用程序跨设备同步用户与 Claude 的对话,允许他们从计算机跳转到应用程序(反之亦然),而不会丢失聊天…

MATLAB数值类型

MATLAB 数值 MATLAB支持各种数字类&#xff0c;包括有符号和无符号整数以及单精度和双精度浮点数。默认情况下&#xff0c;MATLAB将所有数值存储为双精度浮点数。 您可以选择将任何数字或数字数组存储为整数或单精度数字。 所有数值类型都支持基本数组运算和数学运算。 转换…

数据结构篇其四---栈:后进先出的魔法世界

前言 栈的学习难度非常简单&#xff0c;前提是如果你学过顺序表和单链表的话&#xff0c;我直接说我的观点了&#xff0c;栈就是有限制的顺序表和单链表。 栈只允许一端进行插入删除。栈去除了各种情况复杂的插入删除&#xff0c;只允许一端插入删除的特性&#xff0c;这一种数…

Pytorch基础:torch.load_state_dict()方法在加载时不会检查类型

相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 笔者在使用torch.nn.module的load_state_dict中出现了一个问题&#xff0c;一个被注册的张量在加载后居然没有变化&#xff0c;一开始以为是加载出现了问题&#…

ATTCK的优缺点分别是什么

ATT&CK(Adversarial Tactics, Techniques, and Common Knowledge)框架是一个广泛使用的资源,它提供了对网络威胁的深入洞察,特别是关于攻击者可能采取的战术、技术和程序(TTPs)。以下是ATT&CK框架的优缺点: 优点: 全面的威胁情报:ATT&CK框架详细描述了各种…

Linux基础之gcc/g++

目录 一、gcc/g的介绍 二、一个程序的翻译过程 2.1 预处理阶段 2.2 编译阶段 2.3 汇编阶段 2.4 链接阶段 三、动静态库简介 四、动静态库的优缺点 一、gcc/g的介绍 首先&#xff0c;先简单的介绍一下gcc/g。 GCC&#xff08;GNU Compiler Collection&#xff09;是一个…

MySql安装到配置-超详细版

哈喽宝子们&#xff0c;好久不见&#xff0c;大一五一有没有出去玩呀~反正我是没有出去&#xff0c;就5月1号那天晚上跟室友去看了个电影&#xff0c;然后这几天基本都在宿舍“卷”&#xff0c;其实也不是啦&#xff0c;就是学习学习&#xff0c;因为一方面&#xff0c;暑期实习…

debian10 (armbian) 配置CUPS 服务

更新apt apt-update安装相关软件 apt-get install ghostscript apt-get install dc apt-get install foomatic-db-engine apt-get install cups3.修改配置文件 nano /etc/cups/cupsd.conf Listen localhost:631改为 Listen 0.0.0.0:631 以下四段配置加入Allow All # Only li…

大模型公开可用的模型检查点或 API

文章目录 公开可用的模型检查点或 APILLaMA 变体系列大语言模型的公共 API 公开可用的模型检查点或 API 众所周知&#xff0c;大模型预训练是一项对计算资源要求极高的任务。因此&#xff0c;经过预训练的公开模型检查点&#xff08;Model Checkpoint&#xff09;对于推动大语言…

2024牛客五一集训派对day2 Groundhog Looking Dowdy 个人解题思路

前言&#xff1a; 被实验室教练要求要打的这次五一牛客的训练赛&#xff0c;这些区域赛难度的题对于大一的我来说难度实在是太高了&#xff0c;我和我的队友只写了一些非常简单的签到题&#xff0c;其他题目都没怎么看&#xff08;我们太弱了&#xff09;&#xff0c;但我可以分…

Spring Cloud学习笔记(Hystrix):execute,queue,observe,toObservable样例和特性

这是本人学习的总结&#xff0c;主要学习资料如下 - 马士兵教育 1、Overview2、execute()2.1、Overview2.2、示例 3、queue()3.1、Overview3.2、示例 4、observe()4.1、Overview4.2、示例 5、toObservable()5.1、observe()和toObservable()的区别 1、Overview 我们知道Hystrix…

一文看懂卷积神经网络CNN(1)—前馈神经网络

目录 参考资料 一、神经网络 1、人脑神经网络 2、人工神经网络 3、神经网络的发展历史 二、前馈神经网络 1、神经元 &#xff08;1&#xff09;Sigmoid型函数 ① Logistic函数 ②Tanh函数 ③两个函数形状对比 &#xff08;2&#xff09;ReLU函数 ① 带泄露的ReLU函…

vue 设置输入框只能输入数字且只能输入小数点后两位,并且不能输入减号

<el-input v-model.trim"sb.price" placeholder"现价" class"input_w3" oninput"valuevalue.replace(/[^0-9.]/g,).replace(/\.{2,}/g,.).replace(/^(\-)*(\d)\.(\d\d).*$/,$1$2.$3)"/> 嘎嘎简单、、、、、、、、、

微软如何打造数字零售力航母系列科普08 - Yobe 如何联手微软Azure,安全使用客户数据,预测客户购买行为?

Yobe 如何联手Azure&#xff0c;安全使用客户数据&#xff0c;预测客户购买行为&#xff1f; 在当今数据驱动的世界中&#xff0c;了解客户行为并有能力通过数据和分析预测客户意图是企业保持竞争力所应具备的首要优势。Yobi由Max Snow、Bill Wise和Tom Griffiths于2019年创立&…