Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ под Linux

Войти
Регистрация
Восстановить пароль
 
4ik
5 / 5 / 1
Регистрация: 05.02.2013
Сообщений: 86
#1

Не работает dup2 - C++ Linux

24.11.2016, 22:38. Просмотров 414. Ответов 10
Метки нет (Все метки)

Здравствуйте!
Пытаюсь ассоциировать ввод с выводом, но почему-то все равно выводит все в обычный поток вывода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <string>
 
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
 
int main() {
std::string str;
 
if (fork() == 0) {
if (dup2(0, 1) < 0) {
std::cerr « "dup2\n";
} else {
std::cout « "QweEwq\n";
}
exit(0);
}
else {
wait(NULL);
}
 
fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);// не блокирующий ввод
std::istreambuf_iterator<char> it(std::cin), end;
str.assign(it,end);
 
std::cout « "***\n" « str « ' ' « str.length() « '\n';
 
return 0;
}
Сам dup2 возращает нормальное значение. Подумал что мб 0,1,2 нельзя ассоциировать между собой но не нашел инфы, вроде как можно. Вот вывод программы:
[@ ex]$ ./a.out
QweEwq
***
0
То есть он выводит в 1 все и еще не попадает в 0. То есть вроде как dup2 выполняется корректно, но ассоциации нету. Не подскажите в чем проблема?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2016, 22:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не работает dup2 (C++ Linux):

dup2&exec - C Linux
Здравствуйте. int fd = open(...) // successful; dup2(fd, 1); close(fd); execv(prog, args); Вот такой код не работет. Т. е. в...

Мышь работает через раз, то есть запустил ОС - мышь не работает, перезагрузил - мышь работает - Windows 7
Установлена Windows 7 со всеми последними обновлениями. Все всегда замечательно работало. Но с недавних пор мышь стала работать через раз....

При включении компа у меня не работает монитор, но нормально работает ТВ-выход - Компьютерное железо
Уже несколько дней рву волосы на голове.... Такая проблемка: при включении компа у меня не работает монитор, только мигает лампочка...

Не работает монитор комп работает а на мониторе нет изображения что делать ? - Компьютерное железо
У меня компьютер старый давно покупал и мне захотелось проверить включается или нет и тут возникла одна проблема не включается монитор (...

Multimap STL - работает только запись в файл, поиск в файле не работает - C++
И снова здравствуйте. Снова я прошу вашей помощи. Переделал программу с мапом в мульти мап, но что то пошло не так и работает только запись...

не работает в ворде веб компонент,и скачав обновление ow 11 не работает все равно - MS Word
проблема с веб элементами и обновлениями на них))

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
drfaust
258 / 149 / 37
Регистрация: 02.10.2008
Сообщений: 547
Записей в блоге: 1
Завершенные тесты: 1
25.11.2016, 08:43 #2
Может потому что дескрипторы 0 и 1 изначально привязаны к stdin и stdout ?
0
4ik
5 / 5 / 1
Регистрация: 05.02.2013
Сообщений: 86
25.11.2016, 15:09  [ТС] #3
То есть их нельзя ассоциировать между собой?
0
drfaust
258 / 149 / 37
Регистрация: 02.10.2008
Сообщений: 547
Записей в блоге: 1
Завершенные тесты: 1
26.11.2016, 09:35 #4
ХЗ, как работает dup2. Обычный dup создает дубликат дескриптора.
Тут мы имеем два разных дескриптора с разными режимами, один на чтение, другой на запись.

Самому интересно стало.
Например выдержка из мана:
dup2 делает newfd копией oldfd, закрывая newfd, если требуется.
Что бы это значило? Закрывает newfd, если тот открыт а потом ассоциирует oldfd<=>newfd?

Ждём знающих людей.
Как вариант можно попробовать посмотреть через fcntl(1,F_GETFL) - есть ли какие изменения до и после dup2
0
gng
644 / 490 / 133
Регистрация: 08.09.2013
Сообщений: 1,326
26.11.2016, 16:00 #5
4ik, не совсем понял, чего вы хотите добиться.
При запуске программы дескрипторы 0,1,2 ассоциируются с консолью. dup2 работает, как и описано в мане. Новый десктиптор закрывается и сразу (атомарно) ассоциируется со старым.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
 
 
int main() {
        for (int i=0; i<3; i++) write (i, "tty\n", 5);
 
        int fd= open ("/dev/null", O_WRONLY);
        if (dup2(fd, 1) < 0) write (2, "Err!\n", 6);
        else write (1, "NULL\n", 6);
 
        if (dup2(2, 1) < 0) write (2, "Err!\n", 6);
        else write (1, "tty!\n", 6);
        return 0;
}
0
drfaust
258 / 149 / 37
Регистрация: 02.10.2008
Сообщений: 547
Записей в блоге: 1
Завершенные тесты: 1
26.11.2016, 17:28 #6
Т.е. после dup2(0,1) мы должны вместо stdout получить stdin, а stdout окажется закрытым?
Так должно получится?

З.Ы. потому я и просил посмотреть на fcntl до и после dup2
0
gng
644 / 490 / 133
Регистрация: 08.09.2013
Сообщений: 1,326
26.11.2016, 20:25 #7
Цитата Сообщение от drfaust Посмотреть сообщение
Т.е. после dup2(0,1) мы должны вместо stdout получить stdin, а stdout окажется закрытым?
Я представляю этот процесс немного по другому.
До dup2 0,1,2 указывают на /dev/ttyX.
После dup2(0,1) файл /dev/ttyX закрывается с дескриптором 1 и сразу же открывается тот же /dev/ttyX с тем же дескриптором 1. По сути - ничего не меняется.
0
drfaust
258 / 149 / 37
Регистрация: 02.10.2008
Сообщений: 547
Записей в блоге: 1
Завершенные тесты: 1
26.11.2016, 22:27 #8
Тут ты не прав.
/dev/tty* это отдельное устройство со своим терминалом и достучаться до него - крайне системно-специфичная задача.

Дескрипторы 0,1,2 - это стандарнтые ус-ва ввода вывода
для конкретной программы. Если я делаю
Bash
1
ls > 1.txt
то дескриптор 1 будет ассоциирован с файлом ./1.txt , а не с каким-то терминалом
0
gng
644 / 490 / 133
Регистрация: 08.09.2013
Сообщений: 1,326
27.11.2016, 14:48 #9
Цитата Сообщение от drfaust Посмотреть сообщение
то дескриптор 1 будет ассоциирован с файлом ./1.txt , а не с каким-то терминалом
Речь, судя по вопросу ТС, о другом.
Пока дескрипторы 0,1,2 указывают на /dev/tty, вызов dup2 (0,1) ничего не меняет.
Если они будут указывать на разные файлы, этот вызов, очевидно, закроет файл 1, и направит 1 на тот же файл,что и 0.
Впрочем, мой пример выше всё это демонстрирует.
0
4ik
5 / 5 / 1
Регистрация: 05.02.2013
Сообщений: 86
27.11.2016, 19:10  [ТС] #10
Моя задача была отказаться от пайпа с помощью подачи инфы на вход а потом чтения оттуда без блокировки. То есть доч процессу мы отправляем какуюто строку а потом в доч ее считываем просто через cin. Можно ли так сделать?
0
gng
644 / 490 / 133
Регистрация: 08.09.2013
Сообщений: 1,326
27.11.2016, 20:37 #11
Цитата Сообщение от 4ik Посмотреть сообщение
Можно ли так сделать?
Сомневаюсь, что это то, что вам надо.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <unistd.h>
#include <sys/wait.h>
#include <fcntl.h>
 
int main() {
  int fd= open ("/tmp/pipe", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
  if (fork()) {
      sleep (1);
      if (dup2(fd, 1) < 0) std::cerr << "Error!\n";
      else std::cout << "Sending string.\n";
      close (1);
      wait(0);
  }
  else {
    std::string s;
    if (dup2(fd, 0) < 0) std::cerr << "Error!\n";
    else {
      std::getline (std::cin, s);
      std::cout << "Receive " << s << std::endl;
      close (0);
    }
  }
  close (fd);
  return 0;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2016, 20:37
Привет! Вот еще темы с ответами:

Windows 7, не работает часть служб, не работает сеть, восстановление системы не помогает - Windows 7
Приветствую коллеги! Сам админю уже лет 10, не случалось ситуации еще что гугл не помогал, но вот пришел в организацию, на пк банк клиент,...

AS 3.0 Swf не работает, а в тестовом режиме в самом flash и формате exe работает - ActionScript
Доброго времени суток. Такая проблема: есть рабочий код обмена данными с php скриптам. В тестовом режиме(ctrl+Enter) все работает, при...

Работа с excel: 11 версия не работает с 2010 офисом, но работает с 2007, 2013 - C++/CLI
Имеются несколько Microsoft.Office.Interop.Excel.dll,которые используются для записи в excel документ. Проблема в том что 11 версия не...

Не работает php на wps-е. Гланвая страница работает все остальное нет - PHP
На локальном дэнвере все отлично работает. Но при копировании на впс и сдоступом через сеть работает только главная страница сайта. Все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.11.2016, 20:37
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru