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.pswp.cn/news/206941.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/206941.shtml
英文地址,請注明出處:http://en.pswp.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…