Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
5 / 5 / 2
Регистрация: 05.02.2013
Сообщений: 98

Не работает dup2

24.11.2016, 22:38. Показов 1771. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.11.2016, 22:38
Ответы с готовыми решениями:

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

Приложение работает в Debug, странно работает в Release и не работает при билде
Действия выполняются на эмуляторе Pixel 2. Android 9.0. Если я запускаю приложение с конфигурацией Debug, то всё в порядке. При запуске же...

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

10
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
25.11.2016, 08:43
Может потому что дескрипторы 0 и 1 изначально привязаны к stdin и stdout ?
0
5 / 5 / 2
Регистрация: 05.02.2013
Сообщений: 98
25.11.2016, 15:09  [ТС]
То есть их нельзя ассоциировать между собой?
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
26.11.2016, 09:35
ХЗ, как работает dup2. Обычный dup создает дубликат дескриптора.
Тут мы имеем два разных дескриптора с разными режимами, один на чтение, другой на запись.

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

Ждём знающих людей.
Как вариант можно попробовать посмотреть через fcntl(1,F_GETFL) - есть ли какие изменения до и после dup2
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
26.11.2016, 16:00
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
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
26.11.2016, 17:28
Т.е. после dup2(0,1) мы должны вместо stdout получить stdin, а stdout окажется закрытым?
Так должно получится?

З.Ы. потому я и просил посмотреть на fcntl до и после dup2
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
26.11.2016, 20:25
Цитата Сообщение от drfaust Посмотреть сообщение
Т.е. после dup2(0,1) мы должны вместо stdout получить stdin, а stdout окажется закрытым?
Я представляю этот процесс немного по другому.
До dup2 0,1,2 указывают на /dev/ttyX.
После dup2(0,1) файл /dev/ttyX закрывается с дескриптором 1 и сразу же открывается тот же /dev/ttyX с тем же дескриптором 1. По сути - ничего не меняется.
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
26.11.2016, 22:27
Тут ты не прав.
/dev/tty* это отдельное устройство со своим терминалом и достучаться до него - крайне системно-специфичная задача.

Дескрипторы 0,1,2 - это стандарнтые ус-ва ввода вывода
для конкретной программы. Если я делаю
Bash
1
ls > 1.txt
то дескриптор 1 будет ассоциирован с файлом ./1.txt , а не с каким-то терминалом
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
27.11.2016, 14:48
Цитата Сообщение от drfaust Посмотреть сообщение
то дескриптор 1 будет ассоциирован с файлом ./1.txt , а не с каким-то терминалом
Речь, судя по вопросу ТС, о другом.
Пока дескрипторы 0,1,2 указывают на /dev/tty, вызов dup2 (0,1) ничего не меняет.
Если они будут указывать на разные файлы, этот вызов, очевидно, закроет файл 1, и направит 1 на тот же файл,что и 0.
Впрочем, мой пример выше всё это демонстрирует.
0
5 / 5 / 2
Регистрация: 05.02.2013
Сообщений: 98
27.11.2016, 19:10  [ТС]
Моя задача была отказаться от пайпа с помощью подачи инфы на вход а потом чтения оттуда без блокировки. То есть доч процессу мы отправляем какуюто строку а потом в доч ее считываем просто через cin. Можно ли так сделать?
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
27.11.2016, 20:37
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.11.2016, 20:37
Помогаю со студенческими работами здесь

Подключение библиотеки DLL C++: работает на примере консоли и не работает в WinForms App
Здравствуйте! Помогите начинающему бедному студенту!! Осваиваю С++. В книге Прохоренко(программирование в visual studio 2010 express)...

Решил портировать игру на андроид но управление не работает. Прыжок и стрельба работает
Решил портировать игру на андроид но управление не работает. Прыжок и стрельба работает. Очень странно. В этот раз решился заморочится и...

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

У клиента не работает роутер. У Меня дома работает. TRENDnet TEW-432BRP
Добрый день! У клиента установлен TRENDnet TEW-432BRP. Настроен для подключения к Beeline, но это не совсем важно. До определенного...

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru