2017-02-18 8 views
0

私はサンプルプログラムでパイプとフォークの仕組みを学んでいます。私の非常に基本的な実装では、私の子プロセスで、私は0を閉じ、ファイル記述子0が私のパイプの読み込み側になるようにパイプの読み込み側を複製しました。C++のパイプとフォーク

私の親プロセスから、私は文字列を書き出し、子プロセスではcinを使って文字列を読みました。本質的にはパイプの読み込み端です。私が観察するのは完全な文字列です。なぜ私は理解できないようです!

#include <iostream> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

#define TEST_STRING "Hello, Pipe!" 
int main(int argc, char const *argv[]) { 
    int fd[2]; 
    pipe(fd); 

    pid_t pid; 
    if ((pid = fork()) == 0) { 
    //Child 
    close(0); 
    close(fd[1]); 
    int myCin = dup(fd[0]); 
    char buf[sizeof(TEST_STRING)]; 

    // int x; 
    // std::cin >> x; 
    // std::cout << x << std::endl; 
    // read(myCin, buf, sizeof(TEST_STRING)); 
    std::cin >> buf; 

    std::cout << buf << std::endl; 

    } 
    else { 
    //parent 
    write(fd[1], TEST_STRING, sizeof(TEST_STRING)); 
    close(fd[1]); 
    waitpid(pid, NULL, 0); 
    } 
    return 0; 
} 

ここに私のstraceのは同様だ:あなたはcinからそのように読んだとき

clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fd895adaa10) = 1904 
strace: Process 1904 attached 
[pid 1903] write(4, "Hello, Pipe!\0", 13) = 13 
[pid 1903] close(4)     = 0 
[pid 1903] wait4(1904, <unfinished ...> 
[pid 1904] close(0)     = 0 
[pid 1904] close(4)     = 0 
[pid 1904] dup(3)      = 0 
[pid 1904] fstat(0, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0 
[pid 1904] read(0, "Hello, Pipe!\0", 4096) = 13 
[pid 1904] fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0 
[pid 1904] write(1, "Hello,\n", 7)  = 7 
[pid 1904] read(0, "", 4096)   = 0 
[pid 1904] exit_group(0)    = ? 
[pid 1904] +++ exited with 0 +++ 
+0

std :: cin.getline(buf、sizeof(buf));を使用します。 std :: cin >> bufの代わりに。あなたが望む結果を得ることができます。 – lordofire

答えて

2

それは先頭の空白とし、次の空白文字で停止を破棄します。だからこそ、それはそれがしたことだけを返すのです。試してくださいstd:getline

dup()あなたのためにFD 0を選ぶべきではありません。 dup2()を使用して、使用する記述子を指定できます。

私はまた、cinの下からFDを変更することは安全だとは思わない。 FDが二重になる前に、バッファリングされたデータを取得することができました。

+0

plusの下でのFDの変更に関する注意 – LWimsey

関連する問題