2009-12-30 2 views
4

J'ai une application fonctionnant sous Linux, attrapant des signaux et les signalant à syslog.Raison pour SIGPIPE

Cette application signale fréquemment des événements SIGPIPE sans raison apparente

L'application est en cours d'exécution en arrière-plan, comme démon. Les signaux se produisent à des heures d'inactivité sans connexions réseau/socket apparentes. L'application lit et écrit fréquemment sur des cartes disque et DVB (via les pilotes DVB du noyau).

Je voudrais connaître la raison d'être des SIGPIPE. Des moyens pour tracer la source du signal?

Edit: Je ajouté à code:

stdin = freopen("/dev/null", "r", stdin); 
stdout = freopen("/tmp/vdr_stdout", "w", stdout); 
stderr = freopen("/tmp/vdr_stderr", "w", stderr); 

obtenez toujours les SIGPIPEs.

+0

est ma réponse satisfaisante? – jldupont

Répondre

4

Sur les plateformes compatibles POSIX, SIGPIPE est le signal envoyé à un processus lorsqu'il tente d'écrire sur un tuyau sans un processus relié à l'autre extrémité .

Étant donné que vous faites référence à un contexte daemon, peut-être les STD * sont fermés et une tentative de lecture/écriture sur ceux-ci est effectuée .... un rapport de débogage/d'avancement printf peut-être?

+0

Oui, il y a fprintf() s dans un module. Je testerai en reliant stdin, stderr et stdout à un fichier temporaire afin de vérifier si les SIGPIPE disparaissent. Mais cela nécessite un temps d'arrêt ... – Bernd

+0

Les ouvrir à '/ dev/null' est typique. – ephemient

1

Est-ce que votre démon alimenteurs et sortie ?:

fclose (stdin); 
fclose (stdout); 
fclose (stderr); 
+0

Ce n'est pas le cas. Je viens de découvrir qu'il existe des cas d'utilisation pour garder ces ouverts. La partie d'initialisation a le code pair pour attacher stdin, stdout et stderr à un nouveau terminal de contrôle en utilisant freopen() (je n'utilise pas cela) – Bernd

Questions connexes