LINUX.ORG.RU

Еще раз о fork+exec.


0

0

Я дмаю что многие видели что после вылогивания, логонер стартует заново. 
Как я поинмаю это реализовано путём использования вечнго цикла. 
Как пример решения можно рассмотреть kdm, когда выходишь, 
логонер опять стратует, даже Ctrl+Alt+Backspace его убить не в состтояние. 
При этом он состоит из одного файла и работает. 
Используя подсказку полученную на этом форуме, сама она работает, 
т.е. один файл запскает и Х-ы и прогу а вот цикл 
сделать не полчилось.

int main ( int argc, char **argv )
{
	int ret;
	if ( !getenv ( "DISPLAY" ) )
	{
		pid_t pid = fork ( );
		if ( pid != 0 ) //1
		{
			pid_t pid = fork ( );
			if ( pid != 0 )//2
			{
				while ( 1 )
				{
					pid_t pid = fork ( );
					if ( pid != 0 )//3
					{
						set_root ( );
						go_to_cur_dir ( );
						execlp ( XINIT, XINIT, LDM, 0 );
						perror ( XINIT );
					}
				}
			}
		}
	}
	else
	{
		QApplication app ( argc, argv );
		ldm *login = new ldm;
		app.setMainWidget ( login );
		login->show ( );
		ret = app.exec ( );
	}
	return ret;
}

Прошу прощения за назойливость, но может кто подскажет что не так и 
как реализовать повторный самозапуск на вылогивание 
( велик и могуч русский язык ).

Заранее спасибо!!!
★★★★★

Внутри while( 1 ) надо ждать завершения child'а, иначе он пытается запускаться сразу до бесконечности. Посмотрел бы как у меня это сделано :)

Braindead

anonymous
()

Повесь свою прогу на /sbin/init, и будет он ее тебе запускать автоматом после ее смерти (только форкаться не надо, потому как init процессы отслеживает, а не программы, выполняемые в их контексте).

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

> Внутри while( 1 ) надо ждать завершения child'а, иначе он пытается запускаться сразу до бесконечности. Посмотрел бы как у меня это сделано :)

Всё сразу не приметишь :)

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

TO Braindead:

а ты не мог бы показать на моём примере ПЛЗ! Я попробую сам, но если не получиться... вообщем буду благодарен.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Ну хотя бы так: #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <stdlib.h> #include <iostream.h>

int main ( int argc, char **argv ) { int ret; if ( argc <= 1 ) { pid_t pid = fork ( ); if ( pid != 0 ) //1 { pid_t pid = fork ( ); if ( pid != 0 )//2 { while ( 1 ) { pid_t pid = fork ( ); if ( pid == 0 )//3 { execlp ( "./a.out", "./a.out", "slave", 0 ); perror ( "a.out" ); } else { int status; waitpid( pid, &status, 0 ); } } } } } else//slave { for ( int i = 0; i < 3; i++ ) { cout << i << endl; sleep(1); } } return ret; }

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

Сорри

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <iostream.h>

int main ( int argc, char **argv )
{
        int ret;
        if ( argc <= 1 )
        {
                pid_t pid = fork ( );
                if ( pid != 0 ) //1
                {
                        pid_t pid = fork ( );
                        if ( pid != 0 )//2
                        {
                                while ( 1 )
                                {
                                        pid_t pid = fork ( );
                                        if ( pid == 0 )//3
                                        {
                           execlp ( "./a.out", "./a.out", "slave", 0 );
                                                perror ( "a.out" );
                                        }
     else
     {
      int status;
      waitpid( pid, &status, 0 );
     }
                                }
                        }
                }
        }
        else//slave
        {
  for ( int i = 0; i < 3; i++ )
  {
   cout << i << endl;
   sleep(1);
  }
        }
        return ret;
}

Braindead

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

я почти так и сделал но почему то не стартует КДЕ, т.е. появвляется дефолтный фон и тишина, если рубануть Х-ы тремя кнопками то он как и положена стратует но одновременно начинает запускаться КДЕ и мой логонер становиться частью приложений юзера. КДЕ запускаю execlp (..).

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

ГЫ: ребутнул тачку, а вернее ураган прошедший по безкрайним просторам подмосковья а после загрузки стал запускаться как надо!!!

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