Pipes linux

P

Hola tengo un problema que me tiene atascado y seguramente sera un chorrada.

Tengo un programa padre que crea x hijos. Pues bien, los hijos le tienen que devolver al padre un valor float y el padre después deberá valorar esos valores. La comunicación hay que hacerla por pipes y no me aclaro. Os paso el código que tengo por si podéis ayudar.

padre.c

.
.
.
if (pipe(p) < 0) error("Creació pipe");

for (i = 0; i < n; i++) {
switch (pid = fork()) {
      case -1: error("fork");
	  
  case 0:
	   
	   close(p[0]); //ok
	   
	  // close(0);
	   dup(p[0]);
	   	
	   
	   execv(args[0], args);
      	   error("exec");
  default:
	
      sprintf(s, "%s[%d] pid=%d created%sn", color_blue, getpid(), pid, color_end);
	
          if (write(1, s, strlen(s)) < 0) error("write");

		
}

}

for (i = 0; i < n; i++) {

	close(p[1]); //ok

	read(p[0], &m, 5); 
	//sprintf(s, "%c", read(p[0], &m, 5));
	write(p[0], &m, strlen(m));		
			

          pid = wait(&st);

.
.
.

hijo.c

.
.
.

write(p[1], "Holan", 5);
close(p[1]);

exit(0)

NeB1

No sé cual es el error, pero si haces

switch (pid = fork()) {

ese switch no devolverá siempre 1 como diciendo que la asignación de valor se ha realizado correctamente?

es decir, no sería mejor hacer:

pid = fork();

switch(pid)...??

(igual no, eh? es una sugerencia)

B

#2 Eso da lo mismo, realiza la asignación y el valor asignado lo utiliza para evaluar la condición.

Usa las etiquetas

 que apenas se ve algo xd

#4 Y lo hace, siempre es true y entra en el if, con condición me quería referir a lo de dentro del switch que se me ha ido, tienes razón jajaja. Si fuese una condición en lugar de filtrar por valor de retorno sí que estaría mal.
NeB1

#3 ok ok, es que me sonaba que si hacías

if(x = 0)

te devolvía true

TaiCHoKe

#1 Tienes que hacer close y dup en los descriptores de escritura del hijo también. Creo que es lo unico que he visto. Es mas facil hacerlo todo en un archivo

P

Hola, gracias por las respuestas.
El problema es que tiene que ser en dos fichero diferentes; padre.c, hijo.c

El padre es el que crea la pipe y el hijo el que escribe en ella, posteriormente el padre tiene que leer la que dice el hijo.

Con un archivo me sale bien, pero con dos estoy atascado. Podriais poner un ejemplo? Os lo agradeceré mucho, tengo que entregar el jueves y el programa lo tengo muy verde todavía.

Gracias

NeB1

Yo es que hace 5 años que no toco tuberías, estoy verde verde como para ayudarte.

TaiCHoKe

#6 Si usan los mismos descriptores no veo que problema hay en hacerlo de manera "similar". Siguen siendo dos procesos diferentes al igual que si estuvieran en el mismo fichero.

En hijo creas otra pipe y abres según necesites entrada o salida (p[0] o p[1]).

Usuarios habituales