pipe函数、SIGCHLD、execvp

pipe函数

以下是一个使用C语言编写的通过管道(pipe)进行进程间通信的示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>int main() {int pipefd[2];pid_t pid;char buffer[50];// 创建管道if (pipe(pipefd) == -1) {perror("pipe");exit(EXIT_FAILURE);}// 创建子进程pid = fork();if (pid == -1) {perror("fork");exit(EXIT_FAILURE);}// 子进程if (pid == 0) {close(pipefd[1]);  // 关闭写端// 从管道读取数据read(pipefd[0], buffer, sizeof(buffer));printf("子进程读取到的数据:%s\n", buffer);// 关闭读端close(pipefd[0]);exit(EXIT_SUCCESS);}// 父进程else {close(pipefd[0]);  // 关闭读端char message[] = "Hello from parent process!";// 将数据写入管道write(pipefd[1], message, sizeof(message));printf("父进程写入数据成功!\n");// 关闭写端close(pipefd[1]);exit(EXIT_SUCCESS);}
}

该示例中,首先使用pipe函数创建一个管道,然后调用fork函数创建一个子进程。在子进程中,通过read函数从管道中读取数据,并打印输出。在父进程中,通过write函数将数据写入管道。通过这种方式,子进程和父进程之间就可以进行通信了。请注意,在使用完管道后,需要分别关闭管道的读端和写端。

SIGCHLD,execvp、pipe

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>void sigchld_handler(int signum) {int status;pid_t pid;// 等待子进程退出并获取退出状态while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {if (WIFEXITED(status)) {printf("子进程 %d 正常退出,退出状态码: %d\n", pid, WEXITSTATUS(status));} else if (WIFSIGNALED(status)) {printf("子进程 %d 被信号终止,终止信号: %d\n", pid, WTERMSIG(status));}}
}int main() {int pipefds[2];pid_t pid;int status;struct sigaction sa;// 创建管道if (pipe(pipefds) == -1) {perror("pipe");exit(1);}// 注册SIGCHLD信号处理函数sa.sa_handler = sigchld_handler;sigemptyset(&sa.sa_mask);sa.sa_flags = SA_RESTART;if (sigaction(SIGCHLD, &sa, NULL) == -1) {perror("sigaction");exit(1);}// 创建子进程pid = fork();if (pid == -1) {perror("fork");exit(1);} else if (pid == 0) {// 子进程中将标准输出重定向到管道写端close(pipefds[0]); // 关闭管道读端dup2(pipefds[1], STDOUT_FILENO); // 将标准输出重定向到管道写端close(pipefds[1]); // 关闭管道写端// 执行外部命令char *args[] = {"ls", "-l", NULL};if (execvp(args[0], args) == -1) {perror("execvp");exit(1);}} else {// 父进程从管道读端读取子进程的输出close(pipefds[1]); // 关闭管道写端char buffer[1024];int nbytes;while ((nbytes = read(pipefds[0], buffer, sizeof(buffer))) > 0) {write(STDOUT_FILENO, buffer, nbytes);}// 等待子进程退出if (waitpid(pid, &status, 0) == -1) {perror("waitpid");exit(1);}// 检查子进程退出状态if (WIFEXITED(status)) {printf("子进程 %d 正常退出,退出状态码: %d\n", pid, WEXITSTATUS(status));} else if (WIFSIGNALED(status)) {printf("子进程 %d 被信号终止,终止信号: %d\n", pid, WTERMSIG(status));}}return 0;
}

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

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

相关文章

[⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记

前言 DPD 数字预失真技术&#xff0c;是一种用于抑制功率放大器非线性失真的方法。 它通过在信号输入功率放大器&#xff08;PA&#xff09;之前插入一个预失真模块&#xff0c;对输入信号进行适当的调制&#xff0c;以抵消功率放大器引起的非线性失真&#xff0c;使功率放大器…

Ubuntu 安装 CUDA 和 cuDNN 详细步骤

我的Linux系统背景&#xff1a; 系统和驱动都已安装。 系统是centos 8。查看自己操作系统的版本信息&#xff1a;cat /etc/issue或者是 cat /etc/lsb-release 用nvidia-smi可以看到显卡驱动和可支持的最高cuda版本&#xff0c;我的是12.2。驱动版本是535.129.03 首先&#…

[足式机器人]Part2 Dr. CAN学习笔记-数学基础Ch0-9阈值选取-机器视觉中应用正态分布和6-sigma

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-数学基础Ch0-9阈值选取-机器视觉中应用正态分布和6-sigma 5M1E——造成产品质量波动的六因素 人 Man Manpower 机器 Machine 材料 Material 方法 Method 测量 Measurment 环境 Envrionment DMAI…

RESTful 服务的开发

目录 1.RESTful风格介绍2.使用 RESTful 风格设计的用户管理 Web API 的示例代码13.RESTful 风格设计的用户管理 Web API 的示例代码2 1.RESTful风格介绍 RESTful&#xff08;Representational State Transfer&#xff09;是一种软件架构风格&#xff0c;用于设计网络应用程序的…

模块电源(六):前馈电容

一、前馈电容&#xff1a; 前馈电容是与电阻分压的顶部电阻 并联的"可选电容器" 二、计算及仿真&#xff1a; 1、计算 无前馈电容时&#xff0c;输出电压&#xff1a;&#xff1b;有前馈电容时&#xff0c;输出电压&#xff1a;&#xff0c;(其中&#xff0c;&am…

Java工程找不到javax.xml.bind.annotation包

文章目录 问题解决方法参考 问题 最近Java工程找不到javax.xml.bind.annotation包&#xff0c;进行了解决。 解决方法 参考 stackoverflow: package javax.xml.bind.annotation does not exist error javax.xml.bind这个库从Java 11版本就被移除了&#xff0c;缺失了这个包…

crmeb本地开发配置代理

crmeb 是一个开源的商城系统&#xff0c; v5 版本是一个前后端分离的项目&#xff0c; 我们从git仓库中下载下来的是一个文件夹&#xff0c;其结构是这样的 我的系统没有使用docker &#xff0c;使用的是 laragon 的系统 所以首先我们要在 nginx 中配置 之后&#xff0c; 我们…

WebStorm:Mac/Win上强大的JavaScript开发工具

WebStorm是JetBrains公司开发的针对Mac和Windows系统的JavaScript开发工具。它为开发者提供了一站式的代码编辑、调试、测试和版本控制等功能&#xff0c;帮助你更高效地进行Web开发。新版本的WebStorm 2023在性能和用户体验方面都做出了重大改进&#xff0c;让你的JavaScript开…

为什么感染HPV的人越来越多?劲松中西医结合医院专家发表看法

近年来&#xff0c;HPV感染率在我国呈现上升趋势&#xff0c;引起了社会的广泛关注。HPV是一种人乳头瘤病毒&#xff0c;主要通过性接触传播&#xff0c;也是引起宫颈癌的主要原因之一。那么&#xff0c;为什么我国的HPV感染率如此高呢&#xff1f; 首先&#xff0c;我们需要了…

深度学习疲劳检测 驾驶行为检测 - python opencv cnn 计算机竞赛

文章目录 0 前言1 课题背景2 相关技术2.1 Dlib人脸识别库2.2 疲劳检测算法2.3 YOLOV5算法 3 效果展示3.1 眨眼3.2 打哈欠3.3 使用手机检测3.4 抽烟检测3.5 喝水检测 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习加…

远程服务器QEMU+Ubuntu+GRUB+VNC最佳实践

远程服务器QEMUUbuntuGRUBVNC最佳实践 1. 准备2. QEMU启动安装Ubuntu2.1 服务器端2.2 本地端 3. 从服务器终端控制虚拟机GRUB与虚拟机终端 这段时间参与大量内核切换测试工作&#xff0c;实体机需要硬件自检太过笨重&#xff0c;因此主要通过QEMU验证正确性。有一个很大的问题是…

JavaSE基础50题:11. 输出一个整数的每一位

概述 输出一个整数的每一位。 如&#xff1a;1234的每一位是4&#xff0c;3&#xff0c;2&#xff0c;1 。 个位&#xff1a;1234 % 10 4 十位&#xff1a;1234 / 10 123 123 % 10 3 百位&#xff1a;123 / 10 12 12 % 10 2 千位&#xff1a; 12 / 10 1 代码 ublic sta…

ResourceBundle使用详解

ResourceBundle使用详解 这个类主要用来解决国际化和本地化问题。国际化和本地化可不是两个概念&#xff0c;两者都是一起出现的。可以说&#xff0c;国际化的目的就是为了实现本地化。比如对于“取消”&#xff0c;中文中我们使用“取消”来表示&#xff0c;而英文中我们使用…

【小白专用】MySQL入门(详细总结)

3. 创建数据库 使用 create database 数据库名; 创建数据库。 create database MyDB_one; create database DBAliTest; 创建数据库成功后&#xff0c;数据库的数量变成了6个&#xff0c;多了刚才创建的 dbalitest 。 4. 创建数据库时设置字符编码 使用 create database 数据…

YouTube网红营销:出海品牌扩大影响力的关键

随着数字媒体的兴起&#xff0c;社交媒体已成为品牌与消费者之间建立联系的重要桥梁。其中&#xff0c;YouTube作为全球最大的视频分享平台&#xff0c;不仅拥有庞大的用户群体&#xff0c;还聚集了众多有影响力的网红。这些网红在各自的领域内拥有强大的话语权和号召力&#x…

MySQL数据库,初学SQL知识点引入

数据库的相关概念&#xff1a; DB&#xff1a;数据库&#xff08;Database&#xff09;&#xff1a; 即存储数据的仓库&#xff0c;其本质是一个文件系统。保存了一系列有组织的数据。 DBMS&#xff1a;数据库管理系统&#xff08;Database Management System&#xff09;&…

董明珠:格力从制造商到自主创新企业的转变之路

中国制造业的崛起是近几十年来全球经济舞台上最显著的事件之一&#xff0c;而格力电器作为中国制造业的代表之一&#xff0c;其漫长而坚定的自主创新之路&#xff0c;将其从一家传统的制造商转变为一个自主创新的企业&#xff0c;是中国制造业发展历程中的一个亮点。本文将探讨…

虚拟化之指令的Trap和仿真

有时,虚拟机监控程序需要在虚拟机(VM)中模拟操作。例如,VM内的软件可能尝试配置与功耗管理或缓存一致性相关的低级处理器控件。通常,您不希望将VM直接访问这些控件,因为它们可能被用于突破隔离,或影响系统中的其他VM。 trap在执行给定操作(例如读取寄存器)时引发异常…

2023年全国职业院校技能大赛-大数据应用开发-数据可视化

可视化题目与以往相同&#xff0c;做法类似&#xff0c;我这里展示得到语句后处理优化以后的代码&#xff0c;以函数式来写可视化&#xff0c;比以前400-500多行代码简洁到100多行。其他题目见本栏目&#xff0c;那里面的代码都是没有优化后的&#xff0c;这次主要以效率和精简…

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Mybatis查询中返回值四种情况

第一章 Mybatis查询中返回值四种情况 1.1 查询单行数据返回单个对象 /*** 通过id获取员工信息*/ public Employee selectEmpById(int empId);<select id"selectEmpById" resultType"employee">SELECTid,last_name,email,salaryFROMtbl_employeeWHE…