Странно моя прога перезапукается только если она запущена от рута,
а если её запуск прописан через XDM, т.е. скрипт и конфигурационный файл,
у меня Джента и как следствие правил /etc/init.d/xdm и rc.conf.
При запуске через xdm при повторном запуске вылетает сообщение об ошибке
от стартового крипта о том что не может запустить десктоп менеджер.
А от рута, как уже сказал, всё пучком. Вот код.
#include "ldm.h"
#include <sys/wait.h>
size_t get_executable_path ( char* buffer, size_t len )
{
char* path_end;
if ( readlink ("/proc/self/exe", buffer, len ) <= 0 )
return -1;
path_end = strrchr ( buffer, '/' );
if ( path_end == NULL )
return -1;
++path_end;
*path_end = '\0';
return ( size_t ) ( path_end - buffer );
}
void go_to_cur_dir ( )
{
char path[PATH_MAX];
get_executable_path (path, sizeof (path));
chdir ( path );
}
void set_root ( )
{
passwd *pw= getpwnam ( "root" );
setuid( pw->pw_uid );
setgid( pw->pw_gid );
setenv ( "HOME", pw->pw_dir, 1 );
setenv ( "USER", pw->pw_name, 1 );
setenv ( "LOGUSER", pw->pw_name, 1 );
}
int main ( int argc, char **argv )
{
int ret;
set_root ( );
go_to_cur_dir ( );
if ( !getenv ( "LDM_POWER" ) )
{
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 ( );
if ( getenv ( "LDM_POWER" ) )
{
break;
}
execlp ( XINIT, XINIT, LDM, 0 );
perror ( XINIT );
}
else if ( pid != -1 )//3
{
int status = 0;
waitpid( pid, &status, 0 );
}
}
}
}
}
else
{
QApplication app ( argc, argv );
ldm *login = new ldm;
app.setMainWidget ( login );
login->show ( );
ret = app.exec ( );
}
}
return ret;
}
Может кто подскажет, что вызывает такое явление.
Заранее спасибо!!!
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Как реализовать самозапуск чере fork+exec? (2004)
- Форум warning: cannot pass objects of non-POD type (2004)
- Форум Еще раз о fork+exec. (2004)
- Форум Почему не старттует второй бинарник в execlp. (2004)
- Форум Работа с функциями семейства exec (2017)
- Форум Передача аргументов через execlp в запускаемую программу. (2004)
- Форум [fork()+getpid()] Мааа...ленький вопросик (2008)
- Форум Критическая секция (2008)
- Форум Как в sqlite3 сделать «select * from ...» ? (2011)
- Форум Вывести содержание бинарного файла (2013)