Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программное обеспечение Linux и FreeBSD (http://forum.oszone.net/forumdisplay.php?f=11)
-   -   Программа spawn (http://forum.oszone.net/showthread.php?t=17007)

ivank 09-08-2003 21:06 92229

В общем я не нашёл способа заставаить bash запустить программу так, что бы она продолжила работать после того как непосредственно bash умрёт. Т.е. после запуска "xemacs some_file &" в xterm и закрытия этого самого xterm'а, окно xemacs'а умирало :( Короче, я написал программу spawn - после запуска "spawn xemacs some_file" в xterm'е и закрытия xterm'а xemacs продолжает прекрасно работать.

Вот код программы:
Код:

/*
 * Small "spawning" utility - processes run with spawn live after shell
 * from wich spawn utility was run dies. Just enter "spawn xclock" in xterm
 * and close xterm window - xclock will be still runing.
 *
 * (c)2003 Ivan 'ivank' Korostelev
 * mailto: ivank@ivank.ru
 */
#include <unistd.h>
#include <stdio.h>
#include <errno.h>

int main(int argc, char **argv)
{
  if (argc < 2)
    {
      fprintf(stderr, "Usage: spawn <prog> <args>\n");
    }
  if (!fork())
    {
      execvp(argv[1], &argv[1]);
      printf("spawn error: %s\n", strerror(errno));
    }
  return 0;
}

Записать это всё в spawn.c, откопилировать[pre]gcc spawn.c -o spawn
strip spawn[/code]
Стать рутом и скопировать spawn в /usr/local/bin.

Затем, пользователи bash открывают ~/.bashrc и дописывают в него:[pre]alias xemacs="spawn xemacs"
# так же для остальных програм:
# alias <имя програмы> = "spawn <имя програмы>"
shopt -s expand_aliases[/pre]
Пользователи других шеллов, должны знать как  это сделать в их любимой оболочке - не за красвые же глазки они сменили (стандартный) баш, на нечто отнюдь не столь расппространённое.

Всё "xemacs smt" делает то что ожидалось - отткрывает окошко xemacs'а, котороее не зависит от попродившего его шелла (но только в иксах, в консоли работать не будет. Но для консоли есть vim :))

Может кому будет интересно. Кстати, если подобного эффекта можно добиться более простым способом - готов выслушать.

P.S. Для XEmacs более прямым способом открытия файла будет использование gnuclient, но это ртогонально предлагаемоому решению.

Serpenter 05-09-2003 18:45 92230

а не проще ли:
$nohup <progname> &
???

Nigon 06-09-2003 15:50 92231

ivank
Хехе... наверное я не уловил какойто прикол твоей проги...
Я согласин с Serpenter, какая разница между nohup blabla& и твоей прогой ???

[s]Исправлено: Nigon, 15:52 6-09-2003[/s]

makaveli lcf 08-09-2003 20:40 92232

то Nigon
нет брат =  ти ниправ
nohup в иксах несрабатывает
закрываешь х-терм = и все! пропало
(по крайней мере в РХ9ю0)

такшта парень прав)

Zur0 09-09-2003 05:30 92233

Вообще нахрена все это? nohup есть и его юзать надо. А так вы сейчас и cp,ls,rm.mv писать начнете??? Есть баш, настройте его и будет счастье. У меня slackware 9.0, про проблему в Х вообще не слышал. У меня даже когда в консоли процесс в bg отправляеш, можно выйти, а он себе крутится...

Guest 09-09-2003 09:10 92234

ivank
А если вместо execvp попробовать fork() ?

Dimon 09-09-2003 09:12 92235

     ^
     ||
Это был я

Guest 80 247 100 09-09-2003 10:49 92236

Dimon
Цитата:

А если вместо execvp попробовать fork()
..то у тебя скоро разведётся столько fork'ов чты и залогиниьтся не сможешь

Serpenter 09-09-2003 14:57 92237

2makaveli
если xterm не крестиком закрывать, а exit (ctrl-d),  то всё будет рулез.

Dimon 09-09-2003 16:47 92238

Guest 80 247 100
Цитата:

..то у тебя скоро разведётся столько fork'ов чты и залогиниьтся не сможешь
Почему? Просвети.

Serpenter 09-09-2003 20:07 92239

2Dimon:
дядя прав, форков и в натуре разведётся туева хуча (а их количество ограничено) - ведь автор предлагает юзать команду через alias.

А вообще по правильному нужно делать так:
$ exec | nohup <progname> &
тогда происходит реальное открепление дочернего процесса, и xterm даже крестиком закрыть можно будет:) Правда, за pty процесс держится до последнего - это через ps можно увидеть.

Dimon 10-09-2003 21:10 92240

Serpenter

Цитата:

дядя прав, форков и в натуре разведётся туева хуча (а их количество ограничено) - ведь автор предлагает юзать команду через alias.
Я не спорю, отнюдь, а просто хочу понять почему в корректной программе должна быть эта самая туча fork'ов?

glassMonk 11-09-2003 16:57 92241

Странный ivank создал топ а сам в нем не участвует :(.
А может он просто для само утверждения написал это.

Serpenter 11-09-2003 18:25 92242

Автор предлагает юзать через alias - что предусматривает многочисленные вызовы этой программы.
Разница между fork() и execvp() заключается в том, что fork() копирует страницы процесса, что есть нагрузка на проц/память и вообще не имеет смысла в случае, если родительский процесс сразу после форка вылетает - получается просто перегонка содержимого памяти с места на место. А execvp() _заменяет_ образ родительского процесса образом дочернего, что не несёт дополнительной нагрузки и в данном случае является оптимальным решением, имхо. Хотя я уже написал, как это делается не через одно место.


Время: 06:30.

Время: 06:30.
© OSzone.net 2001-