.../ldm/src/main.cpp:83: warning: cannot pass objects of non-POD type `class QString' through `...'; call will abort at runtime
такая вот месага выскакивает при компиляции, как я понял - моя
функция не будет вызвана привыполнение, но как это исправить.
И чё такое non-POD type?
Вот код:
int main ( int argc, char **argv )
{
int ret;
set_root ( );
QString LDM = go_to_cur_dir ( );
ldmWC *wc = new ldmWC;
if ( !getenv ( "DISPLAY" ) & !wc->IAmShutDown ( ) )
{
pid_t pid = fork ( );
if ( pid == 0 ) //1
{
pid_t pid = fork ( );
if ( pid == 0 )//2
{
while ( !wc->IAmShutDown ( ) )
{
pid_t pid = fork ( );
if ( pid == 0 )//3
{
set_root ( );
execlp ( XINIT, XINIT, LDM, 0 ); <--------- вот эта строка
perror ( XINIT );
}
else if ( pid != -1 )//3
{
int status = 0;
waitpid( pid, &status, 0 );
}
}
}
}
}
else
{
.............
Мне в упор надо создавать LDM динамически.
Заранее спасибо!!!
1. POD - plain old data, ты объект класса пытаешься передать через ...
2. Ты совсем с ума сошел и думаешь что execl принимает строки типа QString? Про const char* ты хоть раз слышал?
Ты может каких книжек по программированию купи, а?
Их сейчас есть на русском и недорого.
1. Нельзя передать объект через varying argument list (...).
А execlp() именно такая функция. По крайней мере в случае,
есть у объекта есть, IMHO, copy-конструктор.
За подробностями - в поиск на groups.google.com
2. Вторая ошибка более глубокая и показывает непонимание сути
процесса. Вызов execlp() должен сформировать массив указателей
на указатели на char, в проторечии - массив строк. Тот,
который будет виден в main() как argv. Нельзя передать
через argv объект. Поэтому передавать execlp() QString -
- занятие совершенно бессмысленное.
Да я уже разобрался, а пока копался с другим забыл отпечатать сюда. То что надо делать char я знаю, просто торможу, лето так действует, вернее то что от него осталось.
ТО Begemoth:
ну кто сошёл с ума я не знаю но вот только execlp нормально переваривает
QString'и и прочую парашу, если бы это было не так я бы не сормозил.
void ldmScreen::do_reboot ( )
{
ldmWC *wc = new ldmWC ( );
wc->setShutDown ( );
delete wc;
execlp ( reboot_comand, reboot_comand, 0 ); <---------- this
}
раз
void ldmUsers::auth ( )
{
_auth = new ldmAuth ( );
if ( getPass ( ).length ( ) > 0 )
{
if ( _auth->checkPass ( getName ( ), getPass ( ) ) )
{
passwd *pw= getpwnam ( getName ( ) );
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 );
execlp ( dm, dm, 0 ); <----------- and this
}
else
{
...........
и два
И прошу заметить оба работают, и в обоих динамические строки.
Вот по этому поводу я и ступил.
int execlp(const char *file, const char *arg, ...);
Для особо одаренных - первые два аргумента описаны явно.
В случае
execlp ( reboot_comand, reboot_comand, 0 );
и
execlp ( dm, dm, 0 );
ты _не_ пытаешься передать объект через (...), аргументы у тебя
передаются через вполне конкретные file и arg. И наверное
при наличии у объектов операторов приведения к (char*)
они таки передадутся.
Ну и теперь сравни это с твоей проблемной строчкой:
execlp ( XINIT, XINIT, LDM, 0 );
Разницу видишь?