Как уговорить bash не убивать процессы из конвеера

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

avaava
Сообщения: 27
ОС: Linux

Как уговорить bash не убивать процессы из конвеера

Сообщение avaava »

Есть программа на С++ которая выдает много цифр в качестве вывода, и есть другая, которая их берет. Надо сделть так, что бы вторая не завершалась после работы конвеера:
# ./a.out -f t -c 1| root h.cpp

т.е. что бы root (это такая программа) остался запущенным.
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Как уговорить bash не убивать процессы из конвеера

Сообщение nesk »

avaava писал(а):
21.10.2008 14:25
Есть программа на С++ которая выдает много цифр в качестве вывода, и есть другая, которая их берет. Надо сделть так, что бы вторая не завершалась после работы конвеера:
# ./a.out -f t -c 1| root h.cpp

т.е. что бы root (это такая программа) остался запущенным.

тут дело в самой программе root.
После того, как программа a.out завершиться, а данные в конвейере (канале) закончатся, при попытке прочитать из канала программа root получит EOF. Ну а дальше все зависит от того, как программа root реагирует на эту ситуацию. Предположу, что там цикл читать стандартный ввод до тех про пока нам не вернут конец файла.


в доказательство того, что bash не убивает программы в конвейере:
cat /etc/passwd | more
понятно, что more продолжит работать и по завершению cat

или можно так
sleep 1 | sleep 30



ЗЫ а вот если раньше заканчивается программа, которая стоит справа в конвейере, то мы получим совершенно иную картину. ;)
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
avaava
Сообщения: 27
ОС: Linux

Re: Как уговорить bash не убивать процессы из конвеера

Сообщение avaava »

Тогда как мне добиться того, чего я хочу?
# root h.cpp
Дальше ввожу числа с клавиатуры, потом Ctrl+D и все работает...
а
# echo "23 23"|root h.cpp
заставляет root отработать, нарисовать что-то на экране и тут же умереть...
Хочется просто понять в чем же здесь разница...
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Как уговорить bash не убивать процессы из конвеера

Сообщение nesk »

а что программа root делает после того, как получает EOF?
Разница в том, если мы из терминала получили EOF, мы можем попробовать запросить ввод еще раз и будем еще раз ждать нового ввода и EOF
А если мы читали из канала и из канала получили EOF, при повторном обращении к этому пустому каналу, без писателей, мы тут же будем получать EOF.

и если Ваша программа root, после первого получения EOF пытается еще и еще раз читать с стандартного в вода, в случае если стандартный ввод перенаправлен на канал и которого все писателе мертвы, мы будем каждый раз тут же получать EOF.

вы бы код показали :)
А то это больше та телепатию смахивает. :blush:
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
avaava
Сообщения: 27
ОС: Linux

Re: Как уговорить bash не убивать процессы из конвеера

Сообщение avaava »

Код:

#include "TH1F" #include <iostream> #include "stdio.h" TH1F *h1; using namespace std; int h(){ h1=new TH1F("h1","Histogram title;;",60000,-30000,30000); int n=1; while (!cin.eof()){ cin>>n; h1->Fill(n); }; h1->Draw(); };


root в данном случае просто интерпретирует этот с-файл и создает гистограмму... С консоли все работает как надо, а вот из конвеера не хочет (. Не понимаю почему.
Спасибо сказали:
Аватара пользователя
Subj
Сообщения: 151
Статус: Useful
ОС: win

Re: Как уговорить bash не убивать процессы из конвеера

Сообщение Subj »

Может эта,
echo -n "23 23"|root h.cpp

попробывать? Так, на всякий случай ....
Building better software with Ada
Спасибо сказали:
avaava
Сообщения: 27
ОС: Linux

Re: Как уговорить bash не убивать процессы из конвеера

Сообщение avaava »

Subj писал(а):
21.10.2008 20:55
Может эта,
echo -n "23 23"|root h.cpp

попробывать? Так, на всякий случай ....

Эффект тот же...(
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Как уговорить bash не убивать процессы из конвеера

Сообщение Folderx »

Код: Выделить всё

while (!cin.eof()){

цикл заканчивается когда в потоке ввода заканчиваются символы

когда ты передаешь
echo abc | ./root

echo отправляет в очередь \ncba
запускается root, открывается его ввод и получает эту очередь
abc\n - больше в потоке ввода root не остаётся символов, цикл перестаёт выполняться (дальше только край потока от которого постоянно возвращается EOF)

Код: Выделить всё

while (n<<cin)(){
    if (n == 'Q')
        break;
    h1->Fill(n);
};

я cpp не знаю, потому может не сработать условие, но вроде должно
Спасибо сказали: