= Programmation des tubes Linux = == Travail demandé == Le but de ce TME est de vous faire programmer un squelette de programme qui sera repris lors du projet. Le comportement de cette application est simple, parce que son objectif est de vous faire manipuler les fifos Unix entre deux processus programmés en C et en python. [[Image(htdocs:png/fake2server.png,nolink,400px)]] Vous avez une certaine liberté sur le comportement pourvu que le programme utilise select et utilise un "serveur" en python. Par exemple : - fake lit une valeur sur stdin, - fake ajoute un numéro id et écrit le message sur f2s, - le server lit le message, calcule la parité et renvoie l'id et la parité sur s2f, - fake lit le message et affiche l'id, la valeur et la parité. Vous devez proposer un Makefile qui effectue la compilation et des benchs d'autotest. Vous rédigerez un rapport expliquant le comportement effectif, le code, le Makefile et les tests. == Annexes == Pour vous aider, nous vous proposons des bribes de code utilisant les tubes Lecteur C {{{ //http://stackoverflow.com/questions/2784500/how-to-send-a-simple-string-between-two-programs-using-pipes #include #include #include #include #define MAX_BUF 1024 int main() { int err; int fd; char * myfifo = "/tmp/myfifo"; char buf[MAX_BUF]; /* open, read, and display the message from the FIFO */ fd = open(myfifo, O_RDONLY); while(1) { if ((err =read(fd, buf, MAX_BUF)) == 0) break; printf("Received (%d): %s\n", err,buf); } close(fd); return 0; } }}} Ecrivain C {{{ // http://stackoverflow.com/questions/2784500/how-to-send-a-simple-string-between-two-programs-using-pipes #include #include #include #include int main() { int fd; char * myfifo = "/tmp/myfifo"; /* create the FIFO (named pipe) */ mkfifo(myfifo, 0666); /* write "Hi" to the FIFO */ fd = open(myfifo, O_WRONLY); while (1) { write(fd, "hello\n", sizeof("hello")); sleep(3); } close(fd); /* remove the FIFO */ unlink(myfifo); return 0; } }}} Lecteur Python {{{ import os, time pipe_name = '/tmp/myfifo' if not os.path.exists(pipe_name): os.mkfifo(pipe_name) pipe_in = open(pipe_name,'r',0) while 1: str = pipe_in.readline() print '%s' % str, }}} Ecrivain Python {{{ import os, time pipe_name = '/tmp/myfifo' if not os.path.exists(pipe_name): os.mkfifo(pipe_name) pipe_out = open(pipe_name,'w') while 1: pipe_out.write("hello") pipe_out.flush() time.sleep(1) }}}