wiki:SujetTD02015

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.

fake2server.png

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 <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>

#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 <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

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)
Last modified 9 years ago Last modified on Feb 5, 2015, 2:04:00 PM