Страниц: [1]
  Печать  
Автор Тема: PtSpawn (Photon 1.14)  (Прочитано 975 раз)
talruns
Участник
*
Offline Offline

Сообщений: 38


Просмотр профиля
« : Июля 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
« Последнее редактирование: Июля 27, 2016, 03:09:47 pm от talruns » Записан
deadarcher
Jr. Member
**
Offline Offline

Сообщений: 70



Просмотр профиля
« Ответ #1 : Июля 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цы ?
Ну, а дальше открываем хелп по ПтСпавну и читаем, думаем, экспериментируем
Записан
talruns
Участник
*
Offline Offline

Сообщений: 38


Просмотр профиля
« Ответ #2 : Июля 27, 2016, 03:09:18 pm »

Да нет, это когда для форума делала - ошиблась. Поправила. Читали хелп, думали, эксперементировали. Обратилась сюда, может в логике ошибка? Странно, что программа запускается, а в функцию обработки CbSigchild..., заданную при вызове PtSpawn не попадаю.
Записан
talruns
Участник
*
Offline Offline

Сообщений: 38


Просмотр профиля
« Ответ #3 : Июля 28, 2016, 09:35:05 am »

Оооо, поняла: я забыла добавить sigset-ы (на SIGCHLD). После - все заработало!
Записан
Страниц: [1]
  Печать  
 
Перейти в: