2017-02-18 24 views
0

Я работаю над образцом программы, чтобы узнать, как работают трубы и forking. В моей самой основной реализации, в моем дочернем процессе, я закрыл 0 и дублировал прочитанный конец канала, так что дескриптор файла 0 теперь является прочитанным концом моего канала.C++ труба и вилка

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

с использованием std :: cin.getline (buf, sizeof (buf)); вместо std :: cin >> buf; может получить желаемый результат. – lordofire

ответ

2

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

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

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

+0

плюс 1 для замечания об изменении FD из-под cin – LWimsey