C/Visual C - comunicación bidireccional entre procesos padre e hijo

 
Vista:
Imágen de perfil de Charly
Val: 11
Ha aumentado su posición en 5 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

comunicación bidireccional entre procesos padre e hijo

Publicado por Charly (5 intervenciones) el 30/10/2017 11:48:36
Hola, me han mandado crear un programa con Pipes que permita la comunicación bidireccional entre un proceso padre y otro hijo.
Necesito que hablen alternativamente uno y otro, es decir:

PADRE ENVIA MENSAJE.
HIJO RECIBE MENSAJE de PADRE: Saludos del Padre. .
HIJO ENVIA MENSAJE a su PADRE.
PADRE RECIBE MENSAJE del HIJO: Saludos del hijo. . .

Este el el código que he escrito:

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
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#define SIZE 512
int main(int argc,char **argv){
  pid_t pid;
  int a[2],b[2],readbytes;
  char buffer[SIZE];
  pipe(a);
  pipe(b);
  if((pid=fork())==0){//hijo
    close(a[1]);//cerramos el lado de escritura del pipe
    close(b[0]);//cerramos el lado de lectura del pipe
    while((readbytes=read(a[0],buffer,SIZE))>0){
      write(1,buffer,readbytes);
    }
    close(a[0]);
    strcpy(buffer,"HIJO RECIBE MENSAJE DE PADRE: ");
    strcpy(buffer,"HIJO ENVIA MENSAJE a su PADRE.\n");
    strcpy(buffer,"Saludos del Hijo...\n");
    write(b[1],buffer,strlen(buffer));
    close(b[1]);
  }else{//padre
    close(a[0]);//cerramos el lado de lectura del pipe
    close(b[1]);//cerramos el lado de escritura del pipe
    strcpy(buffer,"PADRE ENVIA MENSAJE.\n");
    strcpy(buffer,"Saludos del Padre..\n");
    strcpy(buffer,"PADRE RECIBE MENSAJE del HIJO: ");
    write(a[1],buffer,strlen(buffer));
    close(a[1]);
    while((readbytes=read(b[0],buffer,SIZE))>0){
      write(1,buffer,readbytes);
    }
    close(b[0]);
  }
  waitpid(pid,NULL,0);
  exit(0);
}

No sé que he hecho mal, pero solo me ejecuta la última fila de cada uno.
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

comunicación bidireccional entre procesos padre e hijo

Publicado por Tom (619 intervenciones) el 15/01/2018 17:19:27
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
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
 
/* */
char *lines[] = {
	"Hola Don Pepito",
	"Hola Don José",
	"¿ Pasó Vd ya por casa ?",
	"Por su casa yo pasé",
	"¿ Y vió Vd a mi abuela ?",
	"A su abuela yo la ví",
	"Adiós Don Pepito",
	"Adiós Don José",
	NULL,
	NULL
};
 
/* */
int main(int argc, char*argv[]) {
	int p0[2], p1[2];
	pid_t child = 0;
 
	pipe(p0);
	pipe(p1);
 
	child = fork();
	if(child > 0) {
		FILE *fin = fdopen(p1[0], "r");
		FILE *fout = fdopen(p0[1], "w");
		char buf[512];
		int i = 1;
 
		close(p0[0]);
		close(p1[1]);
		while(lines[i] && (fgets(buf, 512, fin) > 0)) {
			printf(buf);
			fprintf(fout, "%s\n", lines[i]);
			fflush(fout);
			i+=2;
		}
		wait(0);
	} else if(child == 0) {
		FILE *fin = fdopen(p0[0], "r");
		FILE *fout = fdopen(p1[1], "w");
		char buf[512] = {0};
		int i = 0;
 
		close(p0[1]);
		close(p1[0]);
 
		do {
			fprintf(fout, "%s\n", lines[i]);
			fflush(fout);
			i+=2;
			if(fgets(buf, 512, fin) > 0) {
				printf(buf);
			}
		} while(lines[i]);
	} else {
		perror("fork");
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

comunicación bidireccional entre procesos padre e hijo

Publicado por Tom (619 intervenciones) el 15/01/2018 17:58:12
Pero es más fácil con socketpair()

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
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/socket.h>
 
/* */
char *lines[] = {
	"Hola Don Pepito",
	"Hola Don José",
	"¿ Pasó Vd ya por casa ?",
	"Por su casa yo pasé",
	"¿ Y vió Vd a mi abuela ?",
	"A su abuela yo la ví",
	"Adiós Don Pepito",
	"Adiós Don José",
	NULL,
	NULL
};
 
/* */
int main(int argc, char*argv[]) {
	int s[2];
	pid_t child = 0;
 
	socketpair(AF_UNIX, SOCK_DGRAM + SOCK_CLOEXEC, 0, s);
 
	child = fork();
	if(child > 0) {
		char buf[512];
		size_t l = 0;
		int i = 1;
 
		close(s[1]);
 
		while(lines[i] && ((l = read(s[0], buf, 512)) > 0)) {
			printf("%.*s\n", l, buf);
			write(s[0], lines[i], strlen(lines[i]));
			i+=2;
		}
		wait(0);
	} else if(child == 0) {
		char buf[512] = {0};
		size_t l = 0;
		int i = 0;
 
		close(s[0]);
 
		do {
			write(s[1], lines[i], strlen(lines[i]));
			i+=2;
			l = read(s[1], buf, 512);
			printf("%.*s\n", l, buf);
		} while(lines[i]);
	} else {
		perror("fork");
	}
}
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