亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

簡介

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

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

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

exec相關(guān)

一共有六個分三組記憶

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

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

記憶口訣如下:

0、exec是通用前綴

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

2、 l 代表參數(shù)傳遞的是list, 參數(shù)是一個個傳遞的,最后一個參數(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);

實戰(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);
        // 進行分割
        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) {    /* 子進程 */
            close(pipefd[0]);          // 關(guān)閉讀端
            dup2(pipefd[1], STDOUT_FILENO); // 將標準輸出重定向到管道寫端
            dup2(pipefd[1], STDERR_FILENO); // 將標準錯誤也重定向到管道寫端
            close(pipefd[1]);          // 關(guān)閉原始寫端
            execvp(argv[0], argv);
            _exit(EXIT_FAILURE);
        } else {          /* 父進程 */
            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++中實現(xiàn)子進程執(zhí)行和管道通信詳解的文章就介紹到這了,更多相關(guān)C++子進程執(zhí)行和管道通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言經(jīng)典指針筆試題詳解

    C語言經(jīng)典指針筆試題詳解

    今天博主來講解4道經(jīng)典的指針筆試題,很多朋友沒有深刻理解函數(shù)傳參知識都會在這些題目上出錯,下面話不多說,我們開始
    2021-10-10
  • 一文帶你學習C++中的派生機制

    一文帶你學習C++中的派生機制

    C++是一門面向?qū)ο蟮木幊陶Z言,其中的派生機制是其重要的面向?qū)ο筇匦灾?。本文我們就來詳細地學習一下C++中的派生機制的相關(guān)知識吧
    2023-04-04
  • 解決VC++編譯報錯error C2248的方案

    解決VC++編譯報錯error C2248的方案

    這篇文章主要介紹了解決VC++編譯報錯error C2248的方案的相關(guān)資料,需要的朋友可以參考下
    2015-11-11
  • Visual Studio Code (vscode) 配置C、C++環(huán)境/編寫運行C、C++的教程詳解(主要Windows、簡要Linux)

    Visual Studio Code (vscode) 配置C、C++環(huán)境/編寫運行C、C++的教程詳解(主要Windo

    這篇文章主要介紹了Visual Studio Code (vscode) 配置C、C++環(huán)境/編寫運行C、C++(主要Windows、簡要Linux),本文通過實例截圖給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • C/C++中如何判斷某一文件或目錄是否存在

    C/C++中如何判斷某一文件或目錄是否存在

    以下文章是對C/C++中判斷某一文件或目錄是否存在的實現(xiàn)代碼進行了詳細的分析介紹,需要的朋友可以參考下
    2013-07-07
  • C++中std::optional的使用指南分享

    C++中std::optional的使用指南分享

    C++?17?引入了std::optional,表示一個可能有值的對象,這篇文章主要來和大家聊聊std::optional的使用,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-06-06
  • 在Ubuntu中安裝VSCode并配置C/C++開發(fā)環(huán)境的方法步驟

    在Ubuntu中安裝VSCode并配置C/C++開發(fā)環(huán)境的方法步驟

    這篇文章主要介紹了在Ubuntu中安裝VSCode并配置C/C++開發(fā)環(huán)境的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • C++實現(xiàn)KFC點餐系統(tǒng)

    C++實現(xiàn)KFC點餐系統(tǒng)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)KFC點餐系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 詳解C語言中函數(shù)宏的三種封裝方式

    詳解C語言中函數(shù)宏的三種封裝方式

    函數(shù)宏,即包含多條語句的宏定義,其通常為某一被頻繁調(diào)用的功能的語句封裝,且不想通過函數(shù)方式封裝來降低額外的彈棧壓棧開銷。本文就來聊聊函數(shù)宏的三種封裝方式吧
    2023-03-03
  • C/C++的關(guān)鍵字之static你了解嗎

    C/C++的關(guān)鍵字之static你了解嗎

    這篇文章主要為大家詳細介紹了C/C++的關(guān)鍵字之static,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02

最新評論