从c中读取管道并打印到stdout

时间:2018-01-31 15:36:18

标签: c pipe

我在阅读管道时遇到了一些麻烦。不完全是。我读得很好,只是输出是全局的。

#include <sys/wait.h>

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

int pfd[2];

int main(void)
{
    pid_t   pid;
    int     status;
    char    readbuf[1024];
    int     bytes_read = 0;

    pipe(pfd);

    switch((pid = fork())) {
    case -1:
            perror("fork");
            break;
    case 0:
            /* child */
            close(pfd[0]);
            dup2(pfd[1], 1);        /* stdout */

            /* mkdir -p /home/edgar/testdir */
            chdir("/home/edgar/testdir");

            /* for file in a b c d e f g h i j k l m n o p q r s t u v w x y z;
             * do
             * touch $file
             * done
             */

            execl("/bin/ls", "ls", "-l", (char *)NULL);
            exit(1);
    default:
            /* parent */
            close(pfd[1]);
            dup2(pfd[0], 0);

            pid = wait(&status);
            /* get input back from ls */
            while ((bytes_read = read(pfd[0], readbuf, sizeof readbuf) > 0)) {
                    fprintf(stdout, "%s\n", readbuf);
            }

            printf("child exit status: %d\n", WEXITSTATUS(status));
    }
    return 0;
}

以下是全局输出的示例:

笔记本电脑$ ./test1

-rw-r - r-- 1 edgar edgar 0 Jan 31 09:15你

-rw-r - r-- 1 edgar edgar 0 Jan 31 09:15 v

-rw-r - r-- 1edgaredgarp��

0 Jan 31 09:15 w -rw-r - r-- 1 edgar edgar 0 Jan 31 09:15 x

-rw-r - r-- 1 edgar edgar 0 Jan 31 09:15 y

-rw-r - r-- 1 edgar edgar 0 Jan 31 09:15 z

1 edgar edgar 0 Jan 31 09:15 d

-rw-r - r-- 1 edgar edgar 0 Jan 31 09:15 e

它从a-v精细读取然后w-z很奇怪然后它从d开始。 为了便于阅读,我在上面添加了额外的换行符。

2 个答案:

答案 0 :(得分:2)

C中关于字符串的最重要的事情之一是什么?他们意味着被 constraints host: 'api.project.dev' do resources :statuses root to: 'statuses#index', as: 'api_root' end constraints host: 'admin.api.project.dev' do resources :statuses root to: 'statuses#new' end 终止了!

NUL不会添加read您的字符串 - 它会处理原始数据块,因此您必须自己执行此操作。这也意味着您无法传递缓冲区的完整大小,因为您需要为NUL添加空间

NUL

答案 1 :(得分:0)

这似乎纠正了这个问题:

do {
        bytes_read = read(pfd[0], readbuf, sizeof(readbuf));
        readbuf[bytes_read] = '\0';
        printf("%s", readbuf);
    } while (bytes_read > 0);

感谢您的帮助。