簡體   English   中英

無法使用fork和pipe在C中執行控制台命令

[英]Can't execute console commands in C with fork and pipe

我正在嘗試在C上制作程序,該程序執行控制台shell命令

貓log.txt | awk'{print $ 7}'| 頭-10

但第三個命令不適用於2個當前命令。 這就是我所做的

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

int main() 
{
    int fd[2], status;

    pipe(fd);
    pid_t pid1 = fork();

    if (!pid1) 
    { 
        dup2(fd[1], 1);
        close(fd[0]);
        close(fd[1]);
        char* command[3] = {"/bin/cat", "log.txt", 0}; 
        execvp(command[0], command);
        exit(EXIT_FAILURE);
    } 
    else if (pid1 == -1) 
    {
        fprintf(stderr, "Can't fork, exiting...\n");
        exit(EXIT_FAILURE);
    }

    pid_t pid2 = fork();

    if (!pid2) {
            dup2(fd[0], 0);
            close(fd[0]);
            close(fd[1]);

            char* command[3] = {"awk", "{ print $7 }", 0}; 
            execvp(command[0], command);

            exit(EXIT_FAILURE);
    } else if (pid2 == -1) {
            fprintf(stderr, "Can't fork, exiting...\n"); 
            exit(EXIT_FAILURE);
    }

    pid_t pid3 = fork();

    if (!pid3) {
            dup2(fd[0], 0);
            close(fd[0]);
            close(fd[1]);

            char* command[3] = {"head", "-10", 0}; 
            execvp(command[0], command);

            exit(EXIT_FAILURE);
    } else if (pid3 == -1) {
            fprintf(stderr, "Can't fork, exiting...\n"); 
            exit(EXIT_FAILURE);   
    }

    close(fd[0]);
    close(fd[1]);

    waitpid(pid1, NULL, 0);
    waitpid(pid2, NULL, 0);
    waitpid(pid3, &status, 0);

    exit(status);

    return 0;
}

pid3無法執行。 我試圖在pid3中制作dup2(fd [1],1),但是那是行不通的。 pid3應該具有什么功能才能工作,以及如何使用dup2進行3個以上的命令?

您將必須設置兩個管道-一個用於將cat連接到awk ,另一個用於將awk連接到head

另外,請不要關閉您實際需要的文件描述符(例如,第一個fork中的fd[0] !)。

您已經創建了一個管道。 一管有兩端。 兩端足以完成兩個過程。 如果在一個管道中全部有三個進程,則需要兩個管道。 中間的過程保持在兩個管道上,其他兩個過程保持在其余端上。

看這張圖片:

 cat | awk | head

看到兩個管道符號? 它們是您需要的兩條管道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM