私はサンプルプログラムでパイプとフォークの仕組みを学んでいます。私の非常に基本的な実装では、私の子プロセスで、私は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 +++
std :: cin.getline(buf、sizeof(buf));を使用します。 std :: cin >> bufの代わりに。あなたが望む結果を得ることができます。 – lordofire