Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Interrupt-gesteuerte Socket-Ein-/Ausgabe

&pagelevel(3)&pagelevel

Das SIGIO-Signal informiert einen Prozess, sobald an einem ein Socket (oder allgemein an einem Dateideskriptor) Daten gelesen werden können.

Damit ein Prozess auf das SIGIO-Signal reagieren kann, müssen Sie im Programmcode folgende Vorkehrungen treffen:

  1. Definieren Sie eine Funktion zur Signalbehandlung. Verwenden sie hierfür die Funktion sigaction() (siehe Handbuch "C-Bibliotheksfunktionen für POSIX-Anwendungen").

  2. Setzen Sie entweder die Prozessnummer oder die Prozessgruppennummer, damit die eigene Prozessnummer bzw. Prozessgruppennummer über wartende Eingaben benachrichtigt werden kann. Setzen Sie Prozessnummer oder Prozessgruppennummer mit der Funktion fcntl(). Die voreingestellte Prozessgruppe eines Sockets ist Gruppe 0.

  3. Ermöglichen Sie mit einem weiteren fcntl()-Aufruf die asynchrone Benachrichtigung über wartende Ein-/Ausgabe-Anforderungen.

Der folgende Programmcode veranschaulicht, wie ein Prozess für den Empfang von SIGIO-Signalen vorbereitet wird. Wenn Daten auf dem Socket s gelesen oder geschrieben werden können, wird der Prozess asynchron durch einen Aufruf der benutzerdefinierten SIGIO-Signalbehandlungsfunktion io_handler() informiert.

#define _XOPEN_SOURCE_EXTENDED
#define ERROR_EXIT(M) perror(M); exit(1)
#include <signal.h>
#include <fcntl.h>
#include <sys/file.h>
#include <unistd.h>
#include <stdio.h>
...
void io_handler(int sig, siginfo_t *si, void *ucp);
int s;
struct sigaction act;
...
if (sigaction(SIGIO, NULL, &act) != 0) {
  ERROR_EXIT("sigaction/GET");
}
act.sa_sigaction = io_handler;
if (sigaction(SIGIO, &act, NULL) != 0) {
  ERROR_EXIT("sigaction/SET");
}
if (fcntl(s, F_SETOWN, getpid()) < 0) {
  ERROR_EXIT("fcntl/F_SETOWN");
}
if (fcntl(s, F_SETFL, FASYNC) < 0) {
  ERROR_EXIT("fcntl/F_SETFL=FASYNC");
}