Странно моя прога перезапукается только если она запущена от рута, а если её запуск прописан через 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)
- Форум Работа с функциями семейства exec (2017)
- Форум Почему не старттует второй бинарник в execlp. (2004)
- Форум Передача аргументов через execlp в запускаемую программу. (2004)
- Форум Критическая секция (2008)
- Форум [fork()+getpid()] Мааа...ленький вопросик (2008)
- Форум Как в sqlite3 сделать «select * from ...» ? (2011)
- Форум Поиск ELF сигнатур через ptrace в памяти форка (2015)