Hi,

Going on a 2.6 kernel, I have a trouble with sigwait()

When I send a kill to this program, the exit code is 143 (signal 15 and core)!

Is there a workaround ?

Thanks,

Yves

gcc -g -Wall -D_REENTRANT=1 -D_THREAD_SAFE=1 s.c -lpthread -o s

/===== d�but du code =====/

#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <pthread.h>

typedef    void Sigfunc(int);

#define ThreadBlockSignal()    ThreadSignalAction(SIG_BLOCK)
#define ThreadUnblockSignal()    ThreadSignalAction(SIG_UNBLOCK)

/*----------STATIC------------------*/
extern void ThreadSignalAction(const int how)
{
  sigset_t    newmask;

  if (sigemptyset(&newmask)<0){
      printf("sigemptyset failed");
      return;
  }
  if (sigaddset(&newmask,SIGTERM)<0){
      printf("sigaddset failed");
      return;
  }
  if (pthread_sigmask(how,&newmask,NULL)){
      printf("pthread_sigmask SIG_BLOCK failed");          return;
  }
}

extern Sigfunc * signal_intr(int signo,Sigfunc *func)
{
  struct sigaction    act, oact;

act.sa_handler = func;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
if (signo == SIGALRM){
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT; /* Interrupt mode */
#endif /* SA_INTERRUPT */
}else{
#ifdef SA_RESTART
/*
* automatic restart of interrupted system calls except
* if they are operating on a slow device.
* For select():
* Under BSD, even if SA_RESTART is specified, select() was
* never restarted.
* Under SVR4, if SA_RESTART is specified, even select() and
* pool() are automatically restarted.
*/
act.sa_flags |= SA_RESTART;
#endif /* SA_RESTART */
if (signo == SIGCHLD){
act.sa_flags |= SA_NOCLDSTOP; /* Don't send SIGCHLD when children stop*/
}
}


#ifdef SA_RESETHAND
  act.sa_flags &= ~SA_RESETHAND;    /* signal handle remains installed */
#endif /* SA_RESETHAND */
  if (sigaction(signo, &act, &oact) < 0){
      return(SIG_ERR);
  }
  return(oact.sa_handler);
}

extern int WaitSignal(void)
{
  sigset_t    newmask;
  int        ret;
  int        sig;

  if (sigemptyset(&newmask)<0){
      printf("sigemptyset failed");
      return -1;
  }
  if (sigaddset(&newmask,SIGTERM)<0){
      printf("sigaddset failed");
      return -1;
  }
  printf("Waiting signal ..."); fflush(stdout);
  ret = sigwait(&newmask,&sig);
  if (ret!=0){
      printf("WaitSignal: sigwait failed %d",ret);
  }else{
      printf("WaitSignal: sigwait sig %d",sig);
  }
  return sig;
}

int main(int argc,char * const argv[])
{
  if (signal_intr(SIGTERM,SIG_DFL) == SIG_ERR){
      printf("signal %d (set handle) failed",SIGTERM);
  }

  /* -- Main loop */
  printf("%lu ready ...",(unsigned long)getpid()); fflush(stdout);
      int    signo;

      ThreadUnblockSignal();
      signo = WaitSignal();
      ThreadBlockSignal();
      if (signo==SIGTERM){
          printf("\nSIGTERM in main\n"); fflush(stdout);
      }else{
          printf("\n%d in main\n",signo); fflush(stdout);
      }
  return 0;
}

/===== fin du code =====/

begin:vcard
fn:Yves Crespin
n:Crespin;Yves
org:Quartz
adr:Hameau du Pra - CIDEX 322;;39, rue Victor Hugo;CROLLES;;38920;France
email;internet:[EMAIL PROTECTED]
tel;work:04.76.92.21.91
tel;cell:06.86.42.86.81
x-mozilla-html:FALSE
url:http://crespin.quartz.free.fr/
version:2.1
end:vcard

Reply via email to