nombre de liens durs vers un tube vide linux vs unix

C’est ce que j’ai trouvé en travaillant sur l’un de mes projets de cours. Vous trouverez ci-dessous le bloc de code C pour imprimer les informations sur un tube vide qui n’a encore été connecté à aucun processus.

{ int pfd[2], nread; char s[100]; struct stat pipe_info; if (pipe(pfd) == -1) { perror ("pipe"); return (-1); } if (fstat (pfd[0], &pipe_info) < 0) perror ("fstat"); print_info (&pipe_info); if (fstat (pfd[1], &pipe_info) st_mode); printf ("inode %d\n", pipe_info->st_ino); printf ("device %d\n", pipe_info->st_dev); printf ("minor device %d\n", pipe_info->st_rdev); printf ("num links %d\n", pipe_info->st_nlink); printf ("uid %d\n", pipe_info->st_uid); printf ("gid %d\n", pipe_info->st_gid); printf ("size %d\n", pipe_info->st_size); printf ("atime %d\n", pipe_info->st_atime); printf ("mtime %d\n", pipe_info->st_mtime); printf ("ctime %d\n", pipe_info->st_ctime); printf ("block size %d\n", pipe_info->st_blksize); printf ("block %d\n", pipe_info->st_blocks); } 

J’ai compilé le code source sur une machine Linux et une machine Solaris. Ce que j’ai trouvé, c’est que sur la machine Linux, le nombre de liens est de 1 alors que sur la machine Solaris, le nombre de liens pour le tube est de 0. Je suis relativement nouveau sur les kernelx des deux systèmes et je voudrais savoir pourquoi nombre de liens sont différents sur les deux systèmes?

Le manuel SunOS 5.10 / Solaris 2.x dit ceci à propos du champ st_nlink :

st_nlink Ce champ doit être utilisé uniquement par les commandes administratives.

que je lis comme “ce champ a une valeur absurde”.

Au contraire, la valeur pour Linux a du sens: le tube a un lien vers le processus qui l’a créé. Je m’attends à ce que st_nlink soit égal à 2 une fois que l’autre côté a été connecté à un processus (fourchu). Linux fstat revendique la conformité POSIX, ce qui est bien. La page de manuel Solaris que je possède ne fait pas de telles déclarations.

Si votre question sous-jacente est la suivante: comment puis-je savoir si la face cachée d’un tuyau est connectée, il y a deux réponses:

  1. Votre programme devrait savoir s’il a attaché la face cachée
  2. Vous pouvez essayer d’écrire le canal et obtenir une combinaison de EAGAIN, EWOULDBLOCK, EPIPE ou le signal SIGPIPE.

L’option 2 serait problématique si l’autre côté du tuyau est connecté. Vous pouvez contourner ce problème si vous pouvez créer un message qui ne serait jamais envoyé par le rédacteur pour être rejeté par le lecteur.