Bonjour à tous,

J'ai un comportement des "named pipe" que je ne comprends pas.
Pour cela j'ai fait un petit bout de code sans gestion des erreurs qui est le suivant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int main()
{
	readNamedFifo("myFifo");
	return 0;
}
 
int32_t readNamedFifo(const std::string &path)
{
	int32_t fdFifo = open(path.c_str(), O_RDONLY | O_NONBLOCK);
 
	if (fdFifo >=0)
	{
		char buff[1024]
		int32_t buf_count = read(fdFifo, buff, 4096);
		if (buf_count < 0 && errno != EAGAIN)
		{
			// Une erreur
		}
		else if (buf_count == 0)
		{
			// La fifo est vide
		}
		else
		{
			// Lecture OK
		}
	}
}
Test :
  • Dans terminal1 : mkfifo myFifo
  • Dans terminal2 : je lance mon bout de code et j'ai une fifo vide
  • Dans terminal1 : echo "Test" > myFifo (je n'ai plus la main)
  • Dans terminal2 : je lance mon bout de code et buf_count vaut -1 et errno vaut EAGAIN
  • Dans terminal1 : j'ai de nouveau la main


Mon problème vient du "O_NONBLOCK" je pense.

Dans mon cas je veux au final que mon programme surveille une fifo. Lors du démarrage, si cette dernière n'est pas vide, il la lit et puis la surveille.

Je ne sais pas si je suis clair.

Merci d'avance pour vos réponses.