简单的PIPE程序会读取奇怪的字符

时间:2017-06-07 20:29:51

标签: c pipe

我创建了一个简单的程序,其中包含一个非常基本的过程:孩子写道,父亲读。 奇怪的是,父亲只读了一些奇怪的人物,我不知道为什么(我过去一小时都在努力推断为什么,但没有成功。

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

// cp = Child -> Parent,  pc = Parent -> child
int cp[2], pc[2];
int main (){
    char str[13]="Hello World";
    char received[13];
    pid_t pid;
    pid = fork();
    if (pid == -1){
        printf("An error occured!\n");
        exit(1);
    }
    int res = pipe(cp);
    if (res == -1){
        printf("Error when creating pipe!..\n");
        exit(1);
    }
    //pipe(pc);
    if (pid==0){
        // Child process
        close(cp[0]);
        write(cp[1], str, 10);
        close(cp[1]);
        exit(0);
    }else{
        // Parent process
        close(cp[1]);
        read(cp[0], received, 10);
        close(cp[0]);
        printf("We received from child: %s\n", received);
        exit(1);
    }
    return 0;
}

产出示例: 1)我们收到了孩子:@ 2)从小孩收到了:�XCV�

1 个答案:

答案 0 :(得分:2)

您的主要问题是您在之后创建管道,以便分叉您的流程。

int cp[2];
int res = pipe(cp); // create the pipe before
if (res == -1) {
    perror("pipe()");
    return 1;
}
pid_t pid = fork(); // so child and parent share the same pipe
if (pid == -1) {
    perror("fork()");
    return 1;
}

A tutorial关于codekaizer的管道授权。

read()用于从文件描述符中读取字节。它不会在缓冲区的末尾添加一个空字节。

你必须自己动手:

char received[42];
ssize_t n = read(cp[0], received, sizeof received - 1);
if (n == -1) {
    perror("read()");
    return 1;
}
received[n] = '\0';
printf("%s\n", received);