Есть программа на С++ которая выдает много цифр в качестве вывода, и есть другая, которая их берет. Надо сделть так, что бы вторая не завершалась после работы конвеера:
# ./a.out -f t -c 1| root h.cpp
т.е. что бы root (это такая программа) остался запущенным.
Как уговорить bash не убивать процессы из конвеера
Модераторы: /dev/random, Модераторы разделов
-
- Сообщения: 27
- ОС: Linux
-
- Сообщения: 2268
- Статус: Линукссаксовец
- ОС: MS Windows XP Home SP3
Re: Как уговорить bash не убивать процессы из конвеера
тут дело в самой программе root.
После того, как программа a.out завершиться, а данные в конвейере (канале) закончатся, при попытке прочитать из канала программа root получит EOF. Ну а дальше все зависит от того, как программа root реагирует на эту ситуацию. Предположу, что там цикл читать стандартный ввод до тех про пока нам не вернут конец файла.
в доказательство того, что bash не убивает программы в конвейере:
cat /etc/passwd | more
понятно, что more продолжит работать и по завершению cat
или можно так
sleep 1 | sleep 30
ЗЫ а вот если раньше заканчивается программа, которая стоит справа в конвейере, то мы получим совершенно иную картину.

Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.
0xDEFEC8ED
0xDEFEC8ED
-
- Сообщения: 27
- ОС: Linux
Re: Как уговорить bash не убивать процессы из конвеера
Тогда как мне добиться того, чего я хочу?
# root h.cpp
Дальше ввожу числа с клавиатуры, потом Ctrl+D и все работает...
а
# echo "23 23"|root h.cpp
заставляет root отработать, нарисовать что-то на экране и тут же умереть...
Хочется просто понять в чем же здесь разница...
# root h.cpp
Дальше ввожу числа с клавиатуры, потом Ctrl+D и все работает...
а
# echo "23 23"|root h.cpp
заставляет root отработать, нарисовать что-то на экране и тут же умереть...
Хочется просто понять в чем же здесь разница...
-
- Сообщения: 2268
- Статус: Линукссаксовец
- ОС: MS Windows XP Home SP3
Re: Как уговорить bash не убивать процессы из конвеера
а что программа root делает после того, как получает EOF?
Разница в том, если мы из терминала получили EOF, мы можем попробовать запросить ввод еще раз и будем еще раз ждать нового ввода и EOF
А если мы читали из канала и из канала получили EOF, при повторном обращении к этому пустому каналу, без писателей, мы тут же будем получать EOF.
и если Ваша программа root, после первого получения EOF пытается еще и еще раз читать с стандартного в вода, в случае если стандартный ввод перенаправлен на канал и которого все писателе мертвы, мы будем каждый раз тут же получать EOF.
вы бы код показали
А то это больше та телепатию смахивает.
Разница в том, если мы из терминала получили EOF, мы можем попробовать запросить ввод еще раз и будем еще раз ждать нового ввода и EOF
А если мы читали из канала и из канала получили EOF, при повторном обращении к этому пустому каналу, без писателей, мы тут же будем получать EOF.
и если Ваша программа root, после первого получения EOF пытается еще и еще раз читать с стандартного в вода, в случае если стандартный ввод перенаправлен на канал и которого все писателе мертвы, мы будем каждый раз тут же получать EOF.
вы бы код показали

А то это больше та телепатию смахивает.

Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.
0xDEFEC8ED
0xDEFEC8ED
-
- Сообщения: 27
- ОС: Linux
Re: Как уговорить bash не убивать процессы из конвеера
Код:
#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 в данном случае просто интерпретирует этот с-файл и создает гистограмму... С консоли все работает как надо, а вот из конвеера не хочет (. Не понимаю почему.
-
- Сообщения: 151
- Статус: Useful
- ОС: win
Re: Как уговорить bash не убивать процессы из конвеера
Может эта,
echo -n "23 23"|root h.cpp
попробывать? Так, на всякий случай ....
echo -n "23 23"|root h.cpp
попробывать? Так, на всякий случай ....
Building better software with Ada
-
- Сообщения: 27
- ОС: Linux
-
- Сообщения: 296
- ОС: fedora, mandriva
Re: Как уговорить bash не убивать процессы из конвеера
Код: Выделить всё
while (!cin.eof()){
цикл заканчивается когда в потоке ввода заканчиваются символы
когда ты передаешь
echo abc | ./root
echo отправляет в очередь \ncba
запускается root, открывается его ввод и получает эту очередь
abc\n - больше в потоке ввода root не остаётся символов, цикл перестаёт выполняться (дальше только край потока от которого постоянно возвращается EOF)
Код: Выделить всё
while (n<<cin)(){
if (n == 'Q')
break;
h1->Fill(n);
};
я cpp не знаю, потому может не сработать условие, но вроде должно