Linux — C ++ трубы и вилки

Я работаю над примером программы, чтобы узнать, как работают трубы и разветвление. В моей очень простой реализации, в моем дочернем процессе, я закрыл 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;
}

Вот и мой стрейс:

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

Решение

Когда вы читаете из cin таким образом, он будет отбрасывать ведущие пробелы, а затем остановиться на следующем пробеле. Вот почему он вернул только то, что сделал. Пытаться std:getline,

Вы не должны рассчитывать на dup() выбирая FD 0 для вас. использование dup2() так что вы можете указать, какой дескриптор использовать.

Я также сомневаюсь, что изменение FD из-под cin безопасно. Вы можете получить буферизованные данные до того, как FD будет дублирован.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]