LINUX.ORG.RU

как убить демона, запущенного popen?


0

0

cделал я как мне посоветовали запуск его через popen() - работает, теперь другая проблема - убивать его надо. Если делаешь [f/p]close() - гуевина вызывающая висит, ждет пока оно кончит а оно не кончает, пробовал через fork чтобы получить pid и потом его килять - муйня выходит:

if(pid=fork()==0) { .... close fd[0]; dup2(fd[1]...) ...... execl("/usr/sbin/pppd"....} - не прокатывает, не запускается и гуй в parent совсем неправильно тормозит, делаю вместо exec system() - пускается, но тогда не знаю его pid и немогу убить. У меня такое чуство что не к месту fork использую, что посоветуете? может в тред его вообще засунуть?

anonymous

Проще всего стартовать popen()'ом некий скрипт, который первым делом
передаст в пайп свой PID, а потом execом выполнит требуемого демона.
Тогда будешь знать PID и сможешь его кильнуть.

Я бы сделал через fork, просто аналог попена, возвращающего PID.
Скорее всего, ты где-то элементарно проврался в алгоритме. Запости
подробнее кусок кода, если сам не разберешься.

Die-Hard ★★★★★
()

int fd[2];
if(pipe(fd)==0)
    {
    ppp_pid=fork();
    if(ppp_pid==0)
         {
         close(fd[0]);
         dup2(fd[1],1);
         execl("/usr/sbin/pppd","logfd","1","call"
;,"ISP");
         //system("pppd nodetach call ISP");
         exit(0);
         }
    else
         {
         if(close(fd[1])==0)
             {
             Fl_Window* window = make_window(fd);
             main_w->show(argc,argv);
             return Fl::run();
             }
         exit(0);
         }
    }

anonymous
()
Ответ на: комментарий от anonymous

Примерно так. 
Я, ессно, не проверял.
Похоже, 2 принцип. ошибки: не правильно заданы аргументы у execl и
перепутаны концы пайпов у дочки.
int fd[2];
if(pipe(fd)==0)
    {
    ppp_pid=fork();
    if(ppp_pid==0)
         {
         close(1);
         dup(fd[1]);
         close(fd[1]);
         close(fd[0]);
         execl("/usr/sbin/pppd","/usr/sbin/pppd","logfd",&q
uot;1","call","ISP",NULL);
         //
         //error-detecting code here
         //
         }
    else
         {
         if(close(fd[1])==0)
             {
             Fl_Window* window = make_window(fd);
             main_w->show(argc,argv);
            //
            // Define somewhere callback to send SIGKILL to
            // ppp_pid and wait()
            //
             return Fl::run();
             }
         exit(0);
         }
    }

Die-Hard ★★★★★
()

Неустранимый глюк с кавычкой при постинге:
..."1","call","ISP",NULL);

Die-Hard ★★★★★
()

Насчет концов дочкиного пайпа я прогнал - у тебя все верно было, только у меня в таких случаях dup2 почему-то не работал. Не помню, давно было.

Die-Hard ★★★★★
()

спасибо, и врямь про NULL забыл :) теперь еще вопрос: в родительском треде (далеко в гуе) прибиваю дочку kill(ppp_pid,15) - вырубается не только дочка но и все приложение (пишет в консоль Terminated) - это так и должно быть, это я в гуе дрянной код намутил или это не kill ом делать надо?

anonymous
()
Ответ на: комментарий от anonymous

> ...вырубается не только дочка но и все приложение (пишет в консоль Terminated)
Не должно...

Проверь, чему равен ppp_pid. Если папа умирает с воплем Terminated то,
скорее всего, ppp_pid почему-то 0.

У меня такое вот работает без проблем:
kill(childpid,SIGKILL);
waitpid(childpid,&continuepolling,0);

Еще - может быть, пап broken pipe получает? Спробуй:
signal(SIGPIPE,SIG_IGN);
перед тем, как дочку форкать.

Die-Hard ★★★★★
()

постившему оригинальный вопрос:

if(pid=fork()==0) {... afair имеет смысл if(pid=(fork()==0)) {... , а не if((pid=fork())==0) {... то-есть если не уверен какие у кого приоритеты, ставь скобки, хотя имхо в этом случае gcc ругается(по крайней мере если -Wall ему сказали)

HTH

anonymous
()

ppp_pid проверял тот что нужен, signal тоже вписывал, не помогает, для разнообразия сунул ему вместо pppd шелл-скрипт, который через разные промежутки времени выводит текст - проходит на ура. Что самое интересное, если модем залочен другим pppd, то демон запускаемый из программы ругается что не может открыть модем, но тоже гасится нормально не убивая родителя... Эхх, буду pppd копать...

P.S. а когда в консоли control-C жму, какой символ на stdin идет (в смысле его pppd посылать), или это не то о чем я подумал?

anonymous
()

i = i = i = i = sizeof(0) & 1 ? 1 : 0

что будет в i?

i = (i = sizeof(0)) & 1 ? 1 : 0

что будет в i?

во вторых - при варианте if ((pid = fork()) == ??) ты знаешь pid процесса - при варианте i f(pid =((fork() == 0)) - не знаешь ..

lg ★★
()

2lg:

i = i = i = i = sizeof(0) & 1 ? 1 : 0

означает i = i = i = i = (sizeof(0) & 1) ? 1 : 0

что означает i = ( (sizeof(0) & 1) ? 1 : 0 )

что означает (учитывая sizeof(0) == size(int) <- четное) i = 0;

i = (i = sizeof(0)) & 1 ? 1 : 0

очевидно тоже 0, но внутри выражения i меняется

PS. я собственно комментарий вставил из соображений языка, без привязки к конкретному смыслу fork.

anonymous
()
Ответ на: комментарий от anonymous

> для разнообразия сунул ему вместо pppd шелл-скрипт, который через разные промежутки
> времени выводит текст - проходит на ура.
Спробуй убивать не 15, а 9 сигналом.

Вообще, странно. Либо pppd хитро перехватывает 15 сигнал, либо ты где-то элементарно в
алгоритме лажанулся. Все должно работать.

> а когда в консоли control-C жму, какой символ на stdin идет (в смысле его pppd посылать),
> или это не то о чем я подумал?
Это почти то, о чем ты подумал, хотя и не совсем - AFAIK с клавиатуры через
управляющий терминал ( а не на stdin!) идет сигнал 2 SIGINT,
а не 15 SIGTERM.

Кстати, спробуй заодно и 2 сигнал.

Die-Hard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.