Страниц: 1 [2]
  Печать  
Автор Тема: Поток в программе при завершении становится зомби  (Прочитано 4633 раз)
deadarcher
Jr. Member
**
Offline Offline

Сообщений: 70



Просмотр профиля
« Ответ #15 : Августа 20, 2015, 04:12:31 pm »

Код:

#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <conio.h>
#include <sys/proxy.h>
#include <sys/kernel.h>
#include <process.h>
#include <stdlib.h>
#include <unistd.h>

#define STACK_SIZE  16384
pid_t th_pid=-1, th_proxy=-1;
int flag=0;

void thread( void *parm )
{
    if ((th_proxy = qnx_proxy_attach( 0, 0, 0, -1 ))==-1)
    {
printf("proxy_attach error %d\n\r",errno);
th_proxy=-2;
return;
    }
  
th_pid=getpid();
 
while(flag==0)
{
if (Receive( th_proxy, 0, 0 )==-1) break;
if (flag) break;
printf("thread got a proxy\n\r");
}

qnx_proxy_detach(th_proxy);
printf("thread done\n\r");
    th_proxy=-1;
}


void sound_()
{
if (th_proxy!=-1) Trigger(th_proxy);
}


int main( void )
{
 char  *args[3]={NULL,NULL,NULL}, c;
 int i;
  
printf("Press q to exit \n");              

// stack allocated by OS
if (_beginthread( thread, NULL, STACK_SIZE, args )==-1)
{
printf("_beginthread error %d\n\r",errno);
return -1;
}

for (i=0;i<100;i++,Yield(),delay(50))
if (th_proxy>0 || th_proxy==-2) break;

if (th_proxy<0) { printf("thread error\n\r"); return -1; }

printf("Press 's' for sound_\n\r");
while (c!='q')
{
c=getch();
        if (c=='s') sound_();
}

flag=1;

// kick proxy to end work
if (th_proxy!=-1) Trigger(th_proxy);

// wait for proxy end
for (i=0;i<1000;i++,Yield(),delay(50))
if (th_proxy==-1) break;
  
printf("main end\n\n\r");
return( EXIT_SUCCESS );
  }
Записан
deadarcher
Jr. Member
**
Offline Offline

Сообщений: 70



Просмотр профиля
« Ответ #16 : Августа 20, 2015, 04:18:53 pm »

а это детали реализации (в моем коде поток необходимо было запускать по прерыванию).
qnx_user сорри, мир дружба !
я имел ввиду код из первого поста.
« Последнее редактирование: Августа 21, 2015, 11:38:57 am от deadarcher » Записан
qnx_user
Full Member
***
Offline Offline

Сообщений: 113


Просмотр профиля
« Ответ #17 : Августа 20, 2015, 04:40:10 pm »

а это детали реализации (в моем коде поток необходимо было запускать по прерыванию).
qnx_user сорри, мир дружба !  Wink
Все Ок =)
Записан
deadarcher
Jr. Member
**
Offline Offline

Сообщений: 70



Просмотр профиля
« Ответ #18 : Августа 21, 2015, 01:08:53 pm »

qnx_user, подсмотрел у вас, как сделать "кащея бессмертного"
Ну в смысле как правильно задать флажок процессу, чтобы он мог обрабатывать SIGKILL. А то у нас есть "любители" убивать процессы этим сигналом вместо SIGTERM.
Записан
Страниц: 1 [2]
  Печать  
 
Перейти в: