2010-07-05 5 views
3

Lors de l'écriture d'une simple application client-serveur, cette question m'est venue à l'esprit. Quand quelqu'un essaie d'écrire sur un tuyau cassé, un SIGPIPE est généré. Disons que je gère le signal dans mon code.Envoyer un comportement sur Broken pipe

Maintenant, quelle erreur renvoie l'appel d'écriture - EPIPE ou EINTR (comme il a été interrompu par un signal). J'ai essayé avec un exemple de programme et il me semble que je reçois toujours EPIPE. Est-ce un comportement garanti ou peut-être l'une des deux valeurs d'erreur?

Répondre

2

Posix dit que EPIPE doit être retourné et SIGPIPE envoyé:

  • Pour écrire() s ou pwrite() s à des tuyaux ou FIFOs pas ouvert en lecture par tout procédé ou avec une seule extrémité ouverte.
  • Pour write() s aux sockets qui ne sont plus connectés ou arrêtés pour l'écriture.

Vous pouvez jeter un oeil à la norme Posix here

+0

+1 pour la citation POSIX. –

1

Le retour appel write(2)-1 en cas d'erreur, donc je suppose que vous demandez au sujet de la valeur de errno(3).

Vous obtiendrez EPIPE si vous gérer, bloc ou ignorer le signal. Sinon, le processus est terminé par défaut, voir signal(7).

0

En général, « interrompu par un signal » (EINTR) fait référence au traitement du signal système V Unix tout à fait ridicule, où QUELQUE appel système pourrait échouer si votre processus reçu (et traité) un signal pendant l'appel système. Cela nécessitait de boucler chaque appel système avec do ... while (ret==-1 && errno==EINTR); ou similaire. Bien que POSIX permette toujours ce comportement ou le bon comportement ("BSD"), les systèmes sains comme GNU/Linux ont le comportement BSD par défaut. Vous pouvez toujours obtenir le comportement BSD en appelant le sigaction avec les bons arguments, ou même faire une fonction wrapper pour le faire pour vous. En tant que tel, EINTR n'est pas lié au SIGPIPE causé par des erreurs d'écriture.