Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<stdlib.h>
- #include<unistd.h>
- #include<pthread.h>
- #include<wait.h>
- typedef struct {
- pid_t pid;
- int c;
- int i;
- }info;
- int N;
- int ** tube;
- void filsprodige(int numfils){
- for(int i=0; i<N;i++){
- if(i==(numfils-1)%N){
- close(tube[i][1]);
- }
- else if(i==numfils){
- close(tube[i][0]);
- }
- else{
- close(tube[i][0]);
- close(tube[i][1]);
- }
- }
- if(numfils==0){
- info carlos;
- carlos.c=42;
- carlos.i=0;
- carlos.pid=getpid();
- if (write(tube[0][1],&carlos,sizeof(carlos)) < 0) {
- perror("write");
- exit(1);
- }
- if (read(tube[N-1][0],&carlos,sizeof(info)) < 0) {
- perror("read");
- exit(1);
- };
- puts("coucou");
- carlos.i++;
- printf(" constante :%d\n compteur %d\n",carlos.c,carlos.i);
- }
- else{
- info carlos;
- if (read(tube[(numfils-1)%N][0],&carlos,sizeof(info)) < 0) {
- perror("read2");
- exit(1);
- }
- carlos.i++;
- if (write(tube[numfils][1],&carlos,sizeof(carlos)) < 0) {
- perror("write2");
- exit(1);
- }
- printf("Ici le processus %d j'envoie (%d - %d - %d)\n", numfils, carlos.pid, carlos.c, carlos.i);
- }
- close(tube[(numfils-1)%N][0]);
- close(tube[numfils][1]);
- exit(0);
- }
- void ceationFils(int numfils){
- switch (fork())
- {
- case -1:
- perror("creationfils : echec");
- exit(-2);
- case 0 :
- filsprodige(numfils);
- default :
- break;
- }
- }
- int main(int argc, char* argv[]) {
- N=atoi(argv[1]);
- tube=malloc((N*sizeof(int*)));
- for(int i=0;i<N;i++){
- tube[i]=malloc(sizeof(int)*2);
- if(pipe(tube[i])<0){
- perror("erreur création tube");
- exit(-1);
- }
- }
- for(int i=0;i<N;i++) ceationFils(i);
- for(int i=0;i<N;i++) wait(NULL);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement