Aller au contenu

[C Posix] Histoire de fork de pipe et de select


Messages recommandés

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

#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 :chinois:

Lien vers le commentaire
Partager sur d’autres sites

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 :francais:

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

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 :francais:

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

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

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...