2017-06-07 9 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 codekingによるpipe grantについて。


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