[kohlmann@aufblende.com: signal- handling probleme]

From: Postbote der de-bsd Mailinglisten <postman(at)de.freebsd.org>
Date: Tue, 6 Oct 1998 21:19:24 +0200

-----Forwarded message from Sascha Kohlmann <kohlmann(at)aufblende.com>-----

Received: from stud.uni-goettingen.de (root(at)s2.student.uni-goettingen.de [134.76.24.2])
        by baerenklau.de.freebsd.org (8.8.8/8.8.8) with ESMTP id TAA17116
        for <owner-de-bsd-hackers(at)de.freebsd.org>; Mon, 5 Oct 1998 19:17:15 +0200 (CEST)
        (envelope-from kohlmann(at)aufblende.com)
Received: from ras017.stud.uni-goettingen.de
        ([134.76.45.27] helo=aufblende.com ident=optiba)
        by stud.uni-goettingen.de with esmtp (Exim 2.02 #2)
        id 0zQEFv-0003wr-00
        for owner-de-bsd-hackers(at)de.freebsd.org; Mon, 5 Oct 1998 19:17:07 +0200
Sender: optiba(at)s2.student.uni-goettingen.de
Message-ID: <3618FFBD.24022B00(at)aufblende.com>
Date: Mon, 05 Oct 1998 19:19:57 +0200
From: Sascha Kohlmann <kohlmann(at)aufblende.com>
X-Mailer: Mozilla 4.05 [en] (X11; I; Linux 2.0.34 i586)
MIME-Version: 1.0
To: owner-de-bsd-hackers(at)de.freebsd.org
Subject: signal- handling probleme
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

moin zusammen,

ich bin wahrlich kein anfaenger im unix-programmieren, aber auch keine
superleuchte. deswegen ziehe ich jetzt seit einiger zeit ein problem mit
mir herum, welches ich nicht verstehe.

nach einigen problemen mit linux (unmotivierte abrissen von benannten
datenstrompipes) habe ich ein serverprogramm auf freebsd 2.2.6 portiert.
hier treten besagte fehler nicht oder nur sehr selten auf.

dennoch macht freebsd in einer anderen hinsicht etwas kopfzerbrechen. im
projekt gibt es blockierte netzwerk-systemaufrufe, die ueber ein SIGALRM
abgefangen werden. klappt auch ganz gut. siglongjmp() springt korrekt
zurueck und dann terminiert das programm mit "alrm clock".

ueberhaupt terminiert das system bei jedem signal. langsam weiss ich
nicht mehr weiter.

ist dort igend jemand, der mir hier vielleicht weiterhelfen kann?

ich habe jetzt schon die quellcodes von x programmen durchsucht, die
aehnliches machen und alle(!) sind so aufgebaut wie meine routinen.

was uebersehe ich?

/* ######################################################### */
void *
signale(int signo, void (*func)()) {

  struct sigaction act, oact;

  act.sa_handler = func;
  sigemptyset(&act.sa_mask);
  sigaddset(&act.sa_mask, signo);
  act.sa_flags = 0;

  if(signo == SIGALRM) {
    act.sa_flags |= SA_RESTART; /* SVR4, 4.3+BSD */
  }

  if(sigaction(signo, &act, &oact) < 0) {
    return(SIG_ERR);
  }
  return(oact.sa_handler);
}

/* ######################################################### */
void
sig_alarm(int signo) {

  siglongjmp(jmpbuf, 1);
}

beispiel einer funktion....
/*
#########################################################################
*/

inline
void
p_senderror(int socket, unsigned char errorno) {

  static unsigned char error_msg[4] = {0x80, 0x04, 0x00, 0x00};

  pthread_mutex_lock(&socket_write_mutex);

  error_msg[3] = errorno;
  alarm(15);
  if(sigsetjmp(jmpbuf, 1) == 0) {
    write(socket, error_msg, 4);
    alarm(0);
  }

  pthread_mutex_unlock(&socket_write_mutex);
}

-----End of forwarded message-----
Received on Tue 06 Oct 1998 - 21:19:25 CEST

search this site