QNX.ORG.RU

Разработка => Разработка графических приложений => Тема начата: talruns от Июля 26, 2016, 03:31:30 pm



Название: PtSpawn (Photon 1.14)
Отправлено: talruns от Июля 26, 2016, 03:31:30 pm
Добрый день


Есть процесс, который запускает сторонние программы.

Код:
typedef struct ptspawn ptspawn_t;
struct ptspawn {
pid_t pid;
sig_atomic_t sig_atom;
int status_child;
};

char *arg01[] = {"./t_70", "t_70", NULL};
char *arg02[] = {"./t_71", "t_71", NULL};
//==========================================================
int
TestButtn( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo )
{
int imod;
char buf[256];

widget = widget, apinfo = apinfo, cbinfo = cbinfo;



for(imod = 0_; imod < 2; imod++)
{
                pspawn[imod].sig_atom = 0;
pspawn[imod].pid = SpawnProc(imod);
PtBkgdHandlerProcess();
if (pspawn[imod].pid == -1)
{
// печатаю ошибку запуска

}//if (pidchild == -1)

}// for(imod = begin; imod < end; imod++)


WaitSpawnProc();


return( Pt_CONTINUE );

}


// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
void CbSigchild1(void *data, int status)
{

pspawn[1].sig_atom = 1;
pspawn[1].status_child = status;
printf ("statuschild1 = %d\n", pspawn[1].sig_atom);
fflush( stdout );

}//CbSigchild
// ---------------------------------------------------------------------------//
void CbSigchild2(void *data, int status)
{

pspawn[2].sig_atom = 1;
pspawn[2].status_child = status;
printf ("statuschild2 = %d\n", pspawn[2].sig_atom);
fflush( stdout );

}//CbSigchild

// ---------------------------------------------------------------------------//
//  
// ---------------------------------------------------------------------------//
pid_t SpawnProc ( int i )
{
pid_t pid;

switch (i)
{
case 1:
pid = PtSpawn( arg01[0], (const char **)(arg01), (char const **)environ, NULL, CbSigchild1, data, NULL ); break;
case 2:
pid = PtSpawn( arg02[0], (const char **)(arg02), (char const **)environ, NULL, CbSigchild2, data, NULL ); break;

}//switch

return pid;
}

// ---------------------------------------------------------------------------//
//  
// ---------------------------------------------------------------------------//
void WaitSpawnProc ( void )
{


while((pspawn[1].sig_atom == 0)||(pspawn[2].sig_atom == 0))
{
  delay(10);
PtBkgdHandlerProcess();
}
printf ("WaitSpawnProc END\n");

}



Вопрос:
запуск программ происходит. Но не идут печати
   printf ("WaitSpawnProc END\n");
   printf ("statuschild1 = %d\n", pspawn[1].sig_atom);
   printf ("statuschild2 = %d\n", pspawn[2].sig_atom);


то, есть, как будто какая-то некорректность для PtSpawn


Название: Re: PtSpawn (Photon 1.14)
Отправлено: deadarcher от Июля 27, 2016, 01:41:17 pm
ну как минимум в SpawnProc - case два раза с 1цей:
Код:
case 1:
pid = PtSpawn( arg01[0], (const char **)(arg01), (char const **)environ, NULL, CbSigchild1, data, NULL ); break;
case 1:
pid = PtSpawn( arg02[0], (const char **)(arg02), (char const **)environ, NULL, CbSigchild2, data, NULL ); break;
Там сразу всё и запускается. Затем в CbSigchild pspawn[1] и от [2], я хз, но наверн нада от 0 и 1цы ?
Ну, а дальше открываем хелп по ПтСпавну и читаем, думаем, экспериментируем


Название: Re: PtSpawn (Photon 1.14)
Отправлено: talruns от Июля 27, 2016, 03:09:18 pm
Да нет, это когда для форума делала - ошиблась. Поправила. Читали хелп, думали, эксперементировали. Обратилась сюда, может в логике ошибка? Странно, что программа запускается, а в функцию обработки CbSigchild..., заданную при вызове PtSpawn не попадаю.


Название: Re: PtSpawn (Photon 1.14)
Отправлено: talruns от Июля 28, 2016, 09:35:05 am
Оооо, поняла: я забыла добавить sigset-ы (на SIGCHLD). После - все заработало!