2017-06-07 65 views
0

我創建了一個簡單的程序,其中有一個非常基本的事情:孩子寫道,父親讀取。 奇怪的是,父親只讀奇怪的字符,我不知道爲什麼(我一直在試圖爲過去一小時扣除原因,但沒有成功的輸出簡單的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

+0

你爲什麼做這樣的。 'char str [13] =「Hello World \ 0」;'你不需要用引號加空終止符,如果你使用雙引號,它已經被添加了。 – LethalProgrammer

+0

對不起,這只是一個絕望的東西 – SnuKies

+0

@SnuKies你甚至不需要把大小char str [] =「Hello World」;' – Stargateur

回答

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()用於讀取從一個文件描述符字節。它不會在緩衝區的末尾添加一個nul字節。

你必須自己所說的那樣:

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);