totoharibo
Posts: 4429
Joined: Thu Jan 24, 2013 8:43 am

de C à bash à travers une FIFO

Mon Feb 24, 2020 10:20 am

Pour une fois j'ai besoin d'aide.
Je veux qu'un prgramme en C m'envoie du texte à un programme en bash
l'écriveur :

Code: Select all

#include <stdio.h>
#include <stdlib.h>
#define FIFO_FILE "MYFIFO"

int main(int argc, char *argv[])
{
FILE *fp;
if ( argc != 2 ) {
printf("USAGE: fifoclient [string]\n");
exit(1);
}
if((fp = fopen(FIFO_FILE, "w")) == NULL) {
perror("fopen");
exit(1);
}
fputs(argv[1], fp);
fclose(fp);
return(0);
}
le liseur

Code: Select all

#!/bin/bash

FIFO="MYFIFO"
trap "rm -f MYFIFO" EXIT
[ -p "$FIFO" ] ||  mkfifo "$FIFO"
exec 3< $FIFO
while : ; do
	if read -r -u 3 line ; then
		if [ "$line" = 'quit' ] ; then
			print "%s: 'quit' command receives\n" " $FIFO"
			break
		fi
		printf "%s : %s\n" "FIFO" "$line"
	fi
done
exec 3<&-
le lance le lecteur
puis "ecrit_fifo "123456"
rien de l'autre côté. (la FIFO est vide bien entendu).
Mais cela marche bien de C à C.
Merci pour l'erreur qui doit être grosse depuis le temps que je cherche :lol:

tqhien
Posts: 75
Joined: Thu Feb 02, 2012 10:07 am

Re: de C à bash à travers une FIFO

Mon Feb 24, 2020 12:47 pm

Bonjour,

Je n'ai pas de bash ni de compilateur C sous la main pour tester, donc je ne peux rien confirmer...

- tu as écrit print et non printf sur le message de fin de traitement dans ton liseur, mais c'est pas bien grave et c'est pas ça qui coince je pense.
- tu utilises un fichier "standard" dans ton écriveur alors qu'il faudrait sans doute utiliser un fichier spécial FIFO, via mkfifo(), vu que tu utilises un "named pipe". Quand tu refermes ton fichier après écriture, le système referme peut-être le FIFO en même temps et ton lecteur se retrouve sans rien à lire ?

epoch1970
Posts: 4979
Joined: Thu May 05, 2016 9:33 am
Location: Paris, France

Re: de C à bash à travers une FIFO

Mon Feb 24, 2020 12:53 pm

Pas de commentaire sur la partie "cliente" en C, je ne connais pas.

Pour le "main" en shell :
Pour commencer j'utiliserai un chemin absolu, ex. FIFO='/run/MYFIFO'
Ensuite je ferai attention au test -p, j'ai vu, ailleurs que sous bash, des problèmes avec -p. -e pourrait suffire dans ce cas ?
Idem pour le timing du trap exit. Si le "client" écrit pendant que le shell efface le pipe, le client va rester coincé dans la machine. Et un nouveau client se mettrait à foirer, je crois.

Quand je m'amuse (...) avec des FIFO je fais ample usage de "ps waxu" pour vérifier qu'il n'y a pas des process zombies qui traînent.

Je suggère de faire marcher le bazar avec un client en shell, et ensuite de vérifier si C pose un problème.
"S'il n'y a pas de solution, c'est qu'il n'y a pas de problème." Les Shadoks, J. Rouxel

tqhien
Posts: 75
Joined: Thu Feb 02, 2012 10:07 am

Re: de C à bash à travers une FIFO

Mon Feb 24, 2020 12:58 pm

La partie en Shell fonctionne à priori :

J'ai testé sur un émulateur bash : http://tpcg.io/lk21S2sB


avec le code suivant :

Code: Select all

FIFO="MYFIFO"
trap "rm -f MYFIFO" EXIT
[ -p "$FIFO" ] ||  mkfifo "$FIFO"
{ seq 10 > $FIFO; } &
exec 3< $FIFO
while : ; do
	if read -r -u 3 line ; then
		if [ "$line" = '10' ] ; then
			printf "%s: 'quit' command receives\n" " $FIFO"
			break
		fi
		printf "%s : %s\n" "FIFO" "$line"
	fi
  done
exec 3<&-
et le résultat semble OK.

totoharibo
Posts: 4429
Joined: Thu Jan 24, 2013 8:43 am

Re: de C à bash à travers une FIFO

Mon Feb 24, 2020 4:00 pm

merci pour vos réponses.
@tqhien et epoch1970 : J'ai tenté vos manips mais ça ne marche pas.

De bash à bash,
De C à C ,
de bash à C pas de problème.

Le problème c'est de C à bash :evil:

Que ça doit être GROS :lol:

En attente de vos idées ...

Il me reste la solution de tout faire en C mais le bash m'aurait bien arrangé.

tqhien
Posts: 75
Joined: Thu Feb 02, 2012 10:07 am

Re: de C à bash à travers une FIFO

Mon Feb 24, 2020 5:15 pm

De ce que je comprends/suppose :

De bash à bash, tu crées de part et d'autre un fichier par mkfifo (c'est ma supposition). Ca marche parce que tu crées un vrai named pipe entre les deux scripts.

De C à C, si tu utilises de simples fopen, en fait, je pense que tu fais de l'écriture/lecture dans le même fichier (que tu recrées à chaque fois). C'est pas un pipe, ça y ressemble.

De Bash à C, j'imagine que le bash crée bien le fichier, mais ne le referme pas à chaque écriture. De l'autre côté, le programme C lit la dernière ligne au fur et à mesure, donc ça marche...

De C à bash, ça doit coincer sur l'accès au fichier à un moment ou un autre, cf ce que j'ai trouvé sur SO : https://stackoverflow.com/questions/230 ... ell-script

As-tu essayé d'utiliser mkfifo en C et non fopen pour le côté écriveur ?

totoharibo
Posts: 4429
Joined: Thu Jan 24, 2013 8:43 am

Résolu : de C à bash à travers une FIFO

Wed Feb 26, 2020 4:27 pm

trouvé le "truc", je ne sais pas si c'est légal mais ça marche alors :lol:

le C normal qui ouvre la FIFO,

une simple redirection dans le bash
exec 3< de la FIFO
read -u 3 var
echo $var

merci à tous.
Je vais pouvoir continuer ma bricole 8-)

Return to “Français”