Linux - PIPES PADRE A HIJO

 
Vista:

PIPES PADRE A HIJO

Publicado por Hypocrisy (1 intervención) el 26/11/2009 21:50:11
Hola, llevo varios dias liado con este ejercicio y necesito ayuda de alguien "profesional" para que me resuelva que esta ocurriendo en el "maldito" codigo. El codigo trata de que debo introducir 2 numeros o introducir un documento (que esto lo he conseguido) para hacer el mcd_euclides. Lo que no consigo es comunicar los numeros introducidos del padre al hijo para que los lea. Como lo hariais??
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <errno.h>
int primernombre;
int segonnombre;
void error(char *m)
{
      /* Escriu els errors pel canal estàndard d’errors (canal 2) */
      write(2, m, strlen(m));
      write(2, "\n", 1);
      write(2, strerror(errno), strlen(strerror(errno)));
      exit(1);
}
int main(int argc, char *argv[])
{
      int p[2];
int p2[2];
int p3[2];
int p4[2];
int pid,pid2,pid_acabat;
int primer_nombre;
int segon_nombre;
      int st,st2,resultado,resultado2;
char s[80];
char cadena2[80];
 
 
      if (pipe(p2) < 0) error("Creació pipe");
      if (pipe(p) < 0) error("Creació pipe");
 
      switch (pid=fork())
      {
pid=getpid();
           case -1: error("Fork 1");
            case 0:
 
 
 
if (argc==1){
close(p[1]);
dup2(p[0],0);
close(p[0]);
    /* STDIN = extremo de entrada del pipe */
} else{
close(0);
if (open(argv[1],O_RDONLY)< 0)
			error("Obertura del fitxer");
dup2(p[1],1);
}
 
 
 
close (2);
                  /* Es crea el fitxer que s’assignarà al dispositiu */
                  /* virtual 1 (stdin) que és el primer lliure       */
                  if (open("/dev/null", O_WRONLY|O_CREAT, 0600) < 0)
                        error("Obertura del fitxer");
                          execlp("./mcd_euclides", "./mcd_euclides", (char *)0);
 
 
 
                  	/* Si arriba aquí, execlp ha fallat */
                  	error("Executant mcd_euclides");
 
default: /* Procés pare */
break;
}
      if (pipe(p2) < 0) error("Creació pipe");
      switch (pid2=fork())
      {
 
pid2=getpid();
 
            case -1: error("Fork 1");
            case 0:
 
if (argc==1){
 
close(p[1]);
dup2(p[0],0);
close(p[0]);
 
} else{
close(0);
if (open(argv[1],O_RDONLY)< 0)
			error("Obertura del fitxer");
dup2(p2[1],1);
}
 
close (2);
                  /* Es crea el fitxer que s’assignarà al dispositiu */
                  /* virtual 1 (stdin) que és el primer lliure       */
                  if (open("/dev/null", O_WRONLY|O_CREAT, 0600) < 0)
                        error("Obertura del fitxer");
 
                          execlp("./mcd_basic", "./mcd_basic", (char *)0);
 
 
                  	/* Si arriba aquí, execlp ha fallat */
                  	error("Executant mcd_euclides");
 
                   default: /* Procés pare */
if (argc==1){
sprintf(cadena2,"\nIntrodueix els dos nombres i un salt de línia...");
write (1,cadena2,strlen(cadena2));
read (0,cadena2,strlen(cadena2));
sscanf (cadena2,"%d %d",&primer_nombre,&segon_nombre);
   printf( "Nombre: %d. Edad: %d\n",primer_nombre, segon_nombre);
close(0);
write(1,&primer_nombre,sizeof(int));
write(1,&segon_nombre,sizeof(int));
dup2(p[1],1);
close(p[1]);
close(0);
write(1,&segon_nombre,sizeof(int));
write(1,&primer_nombre,sizeof(int));
dup2(p2[1],1);
close(p2[1]);
 
}
 
close(p[1]);
close(p2[1]);
 
pid_acabat=wait(&st);
if(pid_acabat==pid){
kill(pid2,SIGTERM);
read(p[0],&resultado,sizeof(int));
sprintf(s, "PRINCIPAL pid:%d,mcd_euclides ha sigut el primer en acabar  result1: %d\n ", getpid(),resultado);
		if (write(2, s, strlen(s)) < 0) error("Escriptura inicial");
                  exit(0);
 
}
else{
pid_acabat=wait(&st2);
kill(pid,SIGTERM);
read(p2[0],&resultado2,sizeof(int));
sprintf(s, "PRINCIPAL pid:%d,mcd_basic ha sigut el primer en acabar  result2:%d\n ", getpid(),resultado2);
		if (write(2, s, strlen(s)) < 0) error("Escriptura inicial");
                  exit(0);
}
 
}
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:PIPES PADRE A HIJO

Publicado por Josepo (1 intervención) el 23/12/2009 15:48:20
Correcto
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar