最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中實(shí)現(xiàn)子進(jìn)程執(zhí)行和管道通信詳解

 更新時(shí)間:2024年01月08日 09:14:20   作者:Silent_Blue_Sky  
在這篇博客中,我們將深入探索如何在 C++ 程序中實(shí)現(xiàn)子進(jìn)程的創(chuàng)建與執(zhí)行,以及父子進(jìn)程間的管道通信,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

簡介

在這篇博客中,我們將深入探索如何在 C++ 程序中實(shí)現(xiàn)子進(jìn)程的創(chuàng)建與執(zhí)行,以及父子進(jìn)程間的管道通信。核心代碼提供了一個(gè)框架,用于接收用戶命令、創(chuàng)建子進(jìn)程并利用 execvp 系統(tǒng)調(diào)用執(zhí)行這些命令。此外,我們通過創(chuàng)建管道(pipe),展示了如何在父子進(jìn)程間安全地傳遞數(shù)據(jù)。

本文重點(diǎn)介紹 fork, pipe, 和 execvp 的使用方法,并解釋了如何將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤從子進(jìn)程重定向到父進(jìn)程。這一過程涉及對 Unix 系統(tǒng)調(diào)用的深入理解,尤其是進(jìn)程間通信(IPC)的概念。我們的目標(biāo)是提供一個(gè)清晰的指南,幫助讀者理解和實(shí)現(xiàn)在現(xiàn)代操作系統(tǒng)中廣泛應(yīng)用的進(jìn)程創(chuàng)建、執(zhí)行和通信機(jī)制。

該教程適合對操作系統(tǒng)、進(jìn)程管理以及 Unix/Linux 系統(tǒng)編程感興趣的讀者。無論是系統(tǒng)編程新手還是有經(jīng)驗(yàn)的開發(fā)者,都可以通過這個(gè)實(shí)例加深對進(jìn)程間通信和命令行界面(CLI)應(yīng)用編程的理解。

exec相關(guān)

一共有六個(gè)分三組記憶

execlp -> execvp
execl  -> execv
execle  -> execve

這幾個(gè)函數(shù)的速記

記憶口訣如下:

0、exec是通用前綴

1、 p 代表第一個(gè)參數(shù)是file 也就是程序的名字比如 ls, 如果名字沒帶p, 代表第一個(gè)參數(shù)是path, 比如 /bin/ls

2、 l 代表參數(shù)傳遞的是list, 參數(shù)是一個(gè)個(gè)傳遞的,最后一個(gè)參數(shù)為NULL

3、 v 代表argv, 參數(shù)是用char* 數(shù)組傳遞的

4、 e 代表環(huán)境變量

execlp  l->list,p-> file          參數(shù)就是(file, a1, a2, a3,..., NULL);
execvp  v->argv,p->file.          參數(shù)就是file, aegv)
execl   l->list,沒p -> path       參數(shù)就是(path, a1, a2, a3, ..., NULL);
execv   v->argv,沒p->path         參數(shù)(path, argv);
execle  l->list,沒p->path, e->env 參數(shù)(path, a0, a1, ..., NULL, env);
execve  v->aegv,沒p->path, e->env 參數(shù)(path, argv, env);

實(shí)戰(zhàn)代碼

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

bool isCommandSupport(std::string command) {
    if (command == "ls" || command == "pwd" || command == "ps" || command == "cat" || command == "grep" ||
        command == "wc" || command == "exit") {
        return true;
    }
    return false;
}

void childTask() {
    while (true) {
        // 獲得一整行輸入
        std::string line;
        size_t len = 0;
        std::getline(std::cin, line);
        // 進(jìn)行分割
        char *p = strtok((char *) line.c_str(), " ");
        char *argv[100];
        int argc = 0;
        while (p != NULL) {
            argv[argc++] = p;
            p = strtok(NULL, " ");
        }
        argv[argc] = NULL;
        if (argc == 0) {
            continue;
        }
        if (isCommandSupport(argv[0])) {
            if (strcmp(argv[0], "exit") == 0) {
                exit(0);
            }
        } else {
            printf("command not support\n");
            continue;
        }
        int pipefd[2];
        pid_t pid;
        char buf;
        if (pipe(pipefd) == -1) {
            perror("pipe");
            exit(EXIT_FAILURE);
        }

        pid = fork();
        if (pid == -1) {
            perror("fork");
            exit(EXIT_FAILURE);
        }
        if (pid == 0) {    /* 子進(jìn)程 */
            close(pipefd[0]);          // 關(guān)閉讀端
            dup2(pipefd[1], STDOUT_FILENO); // 將標(biāo)準(zhǔn)輸出重定向到管道寫端
            dup2(pipefd[1], STDERR_FILENO); // 將標(biāo)準(zhǔn)錯(cuò)誤也重定向到管道寫端
            close(pipefd[1]);          // 關(guān)閉原始寫端
            execvp(argv[0], argv);
            _exit(EXIT_FAILURE);
        } else {          /* 父進(jìn)程 */
            close(pipefd[1]);          // 關(guān)閉寫端
            while (read(pipefd[0], &buf, 1) > 0) {
                write(STDOUT_FILENO, &buf, 1);
            }
            close(pipefd[0]);          // 關(guān)閉讀端
            int status;
            waitpid(pid, &status, 0);
            if (WIFEXITED(status)) {
            } else if (WIFSIGNALED(status)) {
                printf("child terminated abnormally, signal %d\n", WTERMSIG(status));
            }
        }
    }
}

int main() {
   childTask();
}

到此這篇關(guān)于C++中實(shí)現(xiàn)子進(jìn)程執(zhí)行和管道通信詳解的文章就介紹到這了,更多相關(guān)C++子進(jìn)程執(zhí)行和管道通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ Boost Heap使用實(shí)例詳解

    C++ Boost Heap使用實(shí)例詳解

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個(gè)可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-11-11
  • C++缺省參數(shù)、函數(shù)重載與引用深入解析

    C++缺省參數(shù)、函數(shù)重載與引用深入解析

    缺省參數(shù)函數(shù)重載以及引用的出現(xiàn)是為了補(bǔ)充C語言語法的不足以及對C語言設(shè)計(jì)不合理的地方進(jìn)行優(yōu)化,引用的出現(xiàn)大大降低了我們學(xué)習(xí)C語言時(shí)相對于指針的難度,也便于我們更好的理解和使用,感興趣的朋友一起看看吧
    2024-04-04
  • C語言中查詢進(jìn)程信號(hào)是否被遮罩或擱置的簡單方法

    C語言中查詢進(jìn)程信號(hào)是否被遮罩或擱置的簡單方法

    這篇文章主要介紹了C語言中查詢進(jìn)程信號(hào)是否被遮罩或擱置的簡單方法,包括sigprocmask函數(shù)和sigpending函數(shù)的簡介,需要的朋友可以參考下
    2015-09-09
  • C++異步操作future和aysnc與function和bind

    C++異步操作future和aysnc與function和bind

    這篇文章主要介紹了C++異步操作future和aysnc與function和bind,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • Visual Studio Code (vscode) 配置C、C++環(huán)境/編寫運(yùn)行C、C++的教程詳解(主要Windows、簡要Linux)

    Visual Studio Code (vscode) 配置C、C++環(huán)境/編寫

    這篇文章主要介紹了Visual Studio Code (vscode) 配置C、C++環(huán)境/編寫運(yùn)行C、C++(主要Windows、簡要Linux),本文通過實(shí)例截圖給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C++實(shí)現(xiàn)LeetCode(168.求Excel表列名稱)

    C++實(shí)現(xiàn)LeetCode(168.求Excel表列名稱)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(168.求Excel表列名稱),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 詳解c++中signal信號(hào)攜帶數(shù)據(jù)的接收與發(fā)送

    詳解c++中signal信號(hào)攜帶數(shù)據(jù)的接收與發(fā)送

    這篇文章主要為大家詳細(xì)介紹了c++中signal信號(hào)攜帶數(shù)據(jù)的接收與發(fā)送的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • C語言編寫基于TCP和UDP協(xié)議的Socket通信程序示例

    C語言編寫基于TCP和UDP協(xié)議的Socket通信程序示例

    這篇文章主要介紹了C語言編寫基于TCP和UDP協(xié)議的Socket通信程序示例,其中TCP的客戶端與服務(wù)器端采用多線程實(shí)現(xiàn),需要的朋友可以參考下
    2016-03-03
  • C語言操作符超詳細(xì)講解上篇

    C語言操作符超詳細(xì)講解上篇

    C?語言提供了豐富的操作符,有:算術(shù)操作符,移位操作符,位操作符,賦值操作符,單目操作符,關(guān)系操作符,邏輯操作符,條件操作符等。因?yàn)槠^大將分兩篇講解,讓我們通讀本篇來詳細(xì)了解吧
    2022-04-04
  • C語言中變參函數(shù)傳參的實(shí)現(xiàn)示例

    C語言中變參函數(shù)傳參的實(shí)現(xiàn)示例

    本文主要介紹了C語言中變參函數(shù)傳參,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評論

扶沟县| 鲁山县| 汕头市| 太白县| 沂南县| 仲巴县| 高要市| 绥中县| 资中县| 黔南| 秭归县| 吉木萨尔县| 高安市| 金川县| 普洱| 繁峙县| 鹤峰县| 江北区| 晋中市| 崇文区| 行唐县| 锦州市| 东港市| 陈巴尔虎旗| 济源市| 三门县| 江源县| 台湾省| 弥渡县| 华容县| 平定县| 日照市| 大洼县| 合作市| 奇台县| 新疆| 博野县| 广南县| 淄博市| 怀柔区| 三亚市|