Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 02 Oct 2000 00:17:11 +0200 (IST)
From:      Roman Shterenzon <roman@harmonic.co.il>
To:        freebsd-stable@freebsd.org
Subject:   Pthreads saga continues..
Message-ID:  <970438631.39d7b7e76d963@webmail.harmonic.co.il>

index | next in thread | raw e-mail

[-- Attachment #1 --]
Good day,
Isn't the main thread should break out of accept when it receives signal from
the other thread?
Am I missing something?

--Roman Shterenzon, UNIX System Administrator and Consultant
[ Xpert UNIX Systems Ltd., Herzlia, Israel. Tel: +972-9-9522361 ]

[-- Attachment #2 --]
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <signal.h>
#include <errno.h>

int sock;
int cmd=0;
pthread_t main_tid;

void* routine(void *arg)
{
  pthread_t my_tid;
 /* while(1); */
  sleep(5);
  my_tid=pthread_self(); 
  printf("%ld: Sending %ld signal\n", my_tid, main_tid);
  pthread_kill(main_tid, SIGUSR1);
  printf("%ld: Sent %ld signal\n", my_tid, main_tid);
}

void usr1handler(int sig)
{
  int rc=-2;
  printf("Closing socket: %d\n", sock);
  rc=close(sock);
  printf("Closed socket, rc: %d\n", rc);
}

int main(void)
{
  pthread_t tid;
  int newfd, sin_size, on=1;
  struct sockaddr_in myaddr, hisaddr;
  /*signal(SIGUSR1, usr1handler);*/

  pthread_create(&tid, NULL, routine, NULL);
  main_tid=pthread_self();

  if ( (sock=socket(PF_INET, SOCK_STREAM, 6))==-1) {
    perror(socket);
    pthread_kill(tid, SIGTERM);
    exit(-1);
  }
  setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

  myaddr.sin_family=PF_INET;
  myaddr.sin_port=htons(1111);
  myaddr.sin_addr.s_addr=INADDR_ANY;
  bzero(&(myaddr.sin_zero), 8);

  if ((bind(sock, (struct sockaddr*)&myaddr, sizeof(struct sockaddr)))==-1) {
    perror(bind);
    pthread_kill(tid, SIGTERM);
    exit(-1);
  }

  if (listen(sock, 2) == -1 ) {
    perror("listen");
    pthread_kill(tid, SIGTERM);
    exit(-1);
  }
  while(1) {
    if (( newfd=accept(sock, (struct sockaddr *)&hisaddr, &sin_size))==-1){
      if ( errno==EINTR ) {
        printf("Got a signal\n");
        if ( cmd ) {
          printf("It was a sign!\n");
          break;
        }
      }
      perror("accept");
      exit(-1);
    }
    printf("connection accepted\n");
    close(newfd);
  }
  pthread_kill(tid, SIGTERM);
  return 0;
}
home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?970438631.39d7b7e76d963>