使用C中的管道在另一个程序中使用cat输出

时间:2014-09-19 02:05:25

标签: c unix pipe cat piping

我想运行:cat somefile | program> UNIX系统中的outputText。

我看过许多东西,比如管道,使用popen,dup2等;我迷路了。

基本代码应为:

  • 使用cat读取program产生的任何输出并做一些魔术,然后将数据输出到outputText。

请问任何建议?

P.S。 这些文件是二进制文件。

更新

我发现这个代码符合上面规定的命令......但是  它做了我不想要的事情。

  1. 如何摆脱sort?我试图删除东西,但后来我收到错误,程序没有运行。
  2. cat读取数据为二进制
  3. 将数据作为二进制文件输出到终端
  4. 请提示?

    int main(void)
    {
        pid_t p;
        int status;
        int fds[2];
        FILE *writeToChild;
        char word[50];
    
        if (pipe(fds) == -1)
        {
            perror("Error creating pipes");
            exit(EXIT_FAILURE);
        }
    
        switch (p = fork())
        {
            case 0: //this is the child process
                close(fds[1]); //close the write end of the pipe
                dup2(fds[0], 0);
                close(fds[0]);
                execl("/usr/bin/sort", "sort", (char *) 0);
                fprintf(stderr, "Failed to exec sort\n");
                exit(EXIT_FAILURE);
    
            case -1: //failure to fork case
                perror("Could not create child");
                exit(EXIT_FAILURE);
    
            default: //this is the parent process
                close(fds[0]); //close the read end of the pipe
                writeToChild = fdopen(fds[1], "w");
                break;
        }
    
        if (writeToChild != 0)
        {
            while (fscanf(stdin, "%49s", word) != EOF)
            {
                //the below isn't being printed.  Why?
                fprintf(writeToChild, "%s end of sentence\n", word);
            }
            fclose(writeToChild);
        }
    
        wait(&status);
    
        return 0;
    }
    

2 个答案:

答案 0 :(得分:1)

这是我的建议,因为你想读写二进制文件:

#include <stdio.h>

int main (void) {
    if (!freopen(NULL, "rb", stdin)) {
        return 1;
    }
    if (!freopen(NULL, "wb", stdout)) {
        return 1;
    }

    char buf[4];
    while (!feof(stdin)) {
        size_t numbytes = fread(buf, 1, 4, stdin);

        // Do something with the bytes here...

        fwrite(buf, 1, numbytes, stdout);
    }
}

答案 1 :(得分:0)

为了能够读取cat的输出(stdout),你不需要管道我发现的任何东西,感谢你们!我被管道拖了一脚...

所以如果你运行“cat somefile | program”,其中 somefile 包含二进制数据...... 你只会看到somefile包含的内容,在终端上重印。

谢谢!现在我可以写完program

/*program.c*/

int main()
{
    int i, num;

    unsigned char block[2];

    while ((num = fread(block, 1, 2, stdin)) == 2)
    {
        for(i = 0; i < 2; i++)
        {
            printf("%02x", block[i]);
        }
    }

}