tsubasaleguedin Posté(e) le 13 juin 2006 Partager Posté(e) le 13 juin 2006 Bonjour amis inpactiens, Je m'essaye a la programmation C posix et je me pose une petite question enfin surtout je rencontre un probleme :) Je viens de faire un petit programme simple qui se resume à : - Forker un processus. - Ouvrir un pipe dans le processus parent qui envoie des données dans le processus enfant. - Ouvrir un pipe dans le processus enfant qui renvoie les données transmise en majuscule (traitement simple de caracteres). Afin de faire ca propre la legende posixienne voudrait que je fasse un select dans le processus parent pour switcher entre le moment d'envoyer les données dans le processus enfant et le moment d'ecrire les données sur STDOUT recu du processus enfant. Mon petit programme sans le select marche actuellement comme ca : #include <unistd.h> #include <stdio.h> #include <stdlib.h> #define MAXBUFFER 512 int main (void) { pid_t pid; char buffer[MAXBUFFER]; char buffer2[MAXBUFFER]; ssize_t noctets; int fd1[2]; int iMyPipe1=pipe(fd1); int fd2[2]; int iMyPipe2=pipe(fd2); int pt=0; fd_set fdset; struct timeval timeout = {0, 10}; FD_ZERO(&fdset); switch(pid=fork()) { case -1: perror("fork\n"); return EXIT_FAILURE; case 0: /*close(fd[1]);*/ for(;;) { noctets=read(fd1[0],&buffer,512); if (noctets>0) { pt=0; while (pt<noctets) { buffer2[pt]=toupper(buffer[pt]); pt=pt+1; } /*noctets=write(STDOUT_FILENO,&buffer2,noctets);*/ noctets=write(fd2[1],&buffer2,noctets); } } break; default: for(;;) { /*printf("Parents\n");*/ noctets=read(STDIN_FILENO,&buffer,MAXBUFFER); if (noctets>0) { noctets=write(fd1[1],&buffer,noctets); } noctets=read(fd2[0],&buffer,MAXBUFFER); if (noctets>0) { noctets=write(STDOUT_FILENO,&buffer,noctets); } } break; } return EXIT_SUCCESS; } Ca marche mais a mon avis je risque des deadlock lors de gros flux de données, comme vous pouvez le voir j'ai commencé a déclarer ma struct pour le select mais je bloque un peu. La légende raconte : * Fill up a fd_set structure with the file descriptors you want to know when data comes in on. * Fill up a fd_set structure with the file descriptors you want to know when you can write on. Mais eu concretement comment mettre ca en place dans ce genre de situation ? Merci de votre aide qui me sera surement d'un grand secours ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Soulfly_tribe90 Posté(e) le 14 juin 2006 Partager Posté(e) le 14 juin 2006 #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> #include <sys/wait.h> #include <sys/types.h> #define MAXLEN 1024 void copie(int s, int d) { char buffer[MAXLEN]; int n; while((n = read(s,buffer,MAXLEN)) > 0) { if(write(d,buffer,n) != n) { perror("Erreur write "); exit(-1); } } } int main() { int tube[2]; pipe(tube); pid_t pid = fork(); switch(pid) { case -1: perror("Erreur fork "); exit(-1); break; case 0: close(tube[0]); close(1); copie(0,tube[1]); close(tube[0]); break; default: close(tube[1]); close(0); copie(tube[0],1); close(tube[0]); wait(0); break; } return 0; } Perso je fais un truc comme ca (c'etait un exercice de td) --> le principe c'est je tape un truc dans la console c'est le fils qui ecrit dans le tube et c'est le pere qui lis dans le tube et l'ecris dans la console... Tu peux l'adapter pour que le pere mette en majuscule... Enfin tu regarde si ca te dis quelque chose tant mieux Lien vers le commentaire Partager sur d’autres sites More sharing options...
tsubasaleguedin Posté(e) le 14 juin 2006 Auteur Partager Posté(e) le 14 juin 2006 Merci de ta réponse :) Mais ce qui m'interresse dans l'affaire est l'utilisation de select :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Soulfly_tribe90 Posté(e) le 14 juin 2006 Partager Posté(e) le 14 juin 2006 Ben je dirais que j'utilise select seulement en reseau lorsque j'ai fait genre un espece de talk multiutilisateurs dans ce cas il est effectivement bien utile Pour la programmation Systeme je l'ai jamais utilisé meme en posix (ou j'utilise plutot les signaux posix...) Lien vers le commentaire Partager sur d’autres sites More sharing options...
tsubasaleguedin Posté(e) le 14 juin 2006 Auteur Partager Posté(e) le 14 juin 2006 Ben je dirais que j'utilise select seulement en reseau lorsque j'ai fait genre un espece de talk multiutilisateurs dans ce cas il est effectivement bien utile Pour la programmation Systeme je l'ai jamais utilisé meme en posix (ou j'utilise plutot les signaux posix...) Tu aurais un exemple de talk multiutilisateur avec un select l'ami ? ca me serait utile pour etudier ca :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Soulfly_tribe90 Posté(e) le 14 juin 2006 Partager Posté(e) le 14 juin 2006 Si tu veux je peux t'envoyer par mail le code du serveur ou du client ou j'utilise un select pour que tu matte --> parce que genre le serveur fait dans les 250 lignes donc je vais pas coller directement ca ici Mais c'est en gros juste tu declare ton select et apres avec la macro FD_ISSET tu verifie les evenements qui arrive !!! Lien vers le commentaire Partager sur d’autres sites More sharing options...
tsubasaleguedin Posté(e) le 14 juin 2006 Auteur Partager Posté(e) le 14 juin 2006 Si tu veux je peux t'envoyer par mail le code du serveur ou du client ou j'utilise un select pour que tu matte --> parce que genre le serveur fait dans les 250 lignes donc je vais pas coller directement ca ici Mais c'est en gros juste tu declare ton select et apres avec la macro FD_ISSET tu verifie les evenements qui arrive !!! Ouais ca m'interresse de matter ca :) si tu peux me mailer le code se serait super sympa -> france_tsubasa AT hotmail.com Merci encore Lien vers le commentaire Partager sur d’autres sites More sharing options...
Soulfly_tribe90 Posté(e) le 14 juin 2006 Partager Posté(e) le 14 juin 2006 Oki!!! bon ben c'est fait Je t'ai donné tout le code Lien vers le commentaire Partager sur d’autres sites More sharing options...
tsubasaleguedin Posté(e) le 15 juin 2006 Auteur Partager Posté(e) le 15 juin 2006 Oki!!! bon ben c'est fait Je t'ai donné tout le code Merci j'ai bien recu :) Je lirais ca tranquillement :) Merci encore ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.