簡體   English   中英

C-將輸入從一個程序傳遞到另一程序

[英]C - Pipe input from one program to another program

我應該創建兩個程序(main和aux),其中main派生一個孩子來執行aux。 父級從用戶那里獲取輸入,直到空行“ \\ n”,然后子級執行aux,這應該將輸入打印回去。 我能夠用注釋的代碼代替execlp()使其在主體中正常工作,但無法使execlp(aux)正常工作。 任何幫助表示贊賞。

“ main.c”

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int main() {
    int fd[2], i;
    char line[100], buffer[100];

    pipe(fd);

    pid_t pid = fork();

    if (pid < 0) {
            printf("Fork Failed\n");
            exit(-1);
    }
    else if (pid > 0) {
            close(fd[0]);
            while(fgets(line, sizeof(line), stdin) && line[0] != '\n') {
                    write(fd[1], line, sizeof(line));
            }
            close(fd[1]);
    }
    else {
            close(fd[1]);
            dup2(fd[0], STDIN_FILENO);

            //while(read(fd[0], buffer, sizeof(buffer)))
            //      printf("> %s", buffer);

            execlp("./aux", "aux", (char *)0);
    }
    return 0;
}

“ aux.c”

#include <stdio.h>
#include <stdlib.h>

int main() {
    char data[100];

    while(fgets(data, sizeof(data), stdin))
            printf(">%s\n", data);

    return 0;
}

樣本輸入/輸出

this
>this

is a test
>
> test

only prints larger text with random \n
>
>ts larger text with random \n

你調用寫(2)是錯誤的(你總是write 100個字節,甚至更短的line -s):

                write(fd[1], line, sizeof(line)); // WRONG

應該使用strlen(3)

            size_t ll = strlen(line);
            ssize_t wc = write(fd[1], line, ll);
            if (wc != ll)
              fprintf(stderr, "write was wrong (only %d, wanted %d) - %s\n",
                      (int) wc, (int) ll, strerror(errno));

由於您只想寫line緩沖區的已填充字節,所以不一定每次都寫100個字節(其中一些未初始化)。

在您的情況下,因為您聲明了char data[100];所以sizeof(data)為100 char data[100];

請仔細閱讀每個使用的函數的文檔(以及ALP或其他有關Unix / POSIX / Linux編程的書)。 strerror(3)errno(3)的文檔告訴您需要添加:

  #include <string.h>
  #include <errno.h>

實際上,如果您想直接使用read(2)write(2) (沒有stdio(3) ),則應該使用更大的緩沖區(例如,至少4Kbytes至少可以提高效率),並且需要管理部分read -s和write -s,然后自己緩沖。

順便說一句,編譯所有警告和調試信息: gcc -Wall -Wextra -g並學習使用gdb調試器strace(1) (和valgrind )。 在一般情況下,被未定義行為 (但是,乍一看,你的程序似乎不具備UB)。

請注意, execlp(3)可能會失敗。 考慮在perror(3)之后添加一些調用。

暫無
暫無

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

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