【问题标题】:C++ pipe and forkC++ 管道和叉子
【发布时间】:2017-07-07 18:27:13
【问题描述】:

我正在编写一个示例程序来了解管道和分叉的工作原理。在我非常基本的实现中,在我的子进程中,我关闭了 0 并复制了管道的读取端,因此文件描述符 0 现在是我的管道的读取端。

从我的父进程中,我写出一个字符串,在我的子进程中,我使用 cin 读取字符串,因为 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:

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;可以得到你想要的结果。

标签: c++ linux pipe fork dup


【解决方案1】:

当您以这种方式从cin 读取时,它将丢弃前导空格,然后在下一个空格字符处停止。所以这就是为什么它只返回它所做的。试试std:getline

您不应该指望dup() 为您选择FD 0。使用dup2(),这样您就可以指定要使用的描述符。

我也怀疑从 cin 下更改 FD 是否安全。您可以从 FD 被欺骗之前获取缓冲数据。

【讨论】:

  • 加 1 表示关于从 cin 下更改 FD 的备注
猜你喜欢
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
相关资源
最近更新 更多