Sábado 14 de Diciembre de 2024, 17:55
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Pipes entre procesos
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Pipes entre procesos (Leído 2166 veces)
orilla
Nuevo Miembro
Mensajes: 4
Pipes entre procesos
«
en:
Domingo 19 de Octubre de 2008, 18:15 »
0
Bien, tengo que crear un proceso padre con dos hijos, luego conectarlos mediante un pipe, y entonces mandar un valor aleatorio (rand) desde el padre al hijo.Este numero aleatorio, sera las veces que tendre que imprimir el pid del padre y el hijo. La creación del padre y los hijos creo que lo tengo bien, el problema es cuando le paso los parametros al write y al read que nose si lo hago bien, ademas, me da un error con el strlen. Os dejo el codigo y haber si me podeis indicar si lo hago bien o que pasa. Lo del readbuffer lo puse porque lo vi en un programa, pero alli se pasaba un string en vez de un int :S
Muchas gracias
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
pid_t pid1, pid2;
int status1, status2, nbytes;
int p1[2], p2[2];
int buffer;
char readbuffer[80];
if(pipe(p1) < 0)
{
perror( "Errorn");
}
printf("Soy el padre %dn", getpid());
pid1=fork();
if ( pid1<0)
{
perror("Se ha producido un error n");
}
if ( pid1 == 0 )
{ /* hijo */
close(p1[1]);
//0 = read
nbytes = read(p1[0], readbuffer, sizeof(readbuffer));
printf("Numero recibido: %d", readbuffer);
while (buffer>0)
{
printf("Soy el primer hijo %d, n", getpid());
printf(" Soy el padre %d,n",getppid());
alarm(5);
buffer=buffer -1;
}
}
else
{ /* padre */
pid2=fork();
if(pid2<0){
perror("Se ha producido un error n");
}
if ( pid2 == 0 )
{ /* segundo hijo */
close(p2[1];
while (buffer>0)
{
printf("Soy el segundo hijo %d, n", getpid());
printf(" Soy el padre %d,n",getppid());
alarm(5);
buffer=buffer -1;
}
}
else
{ /* padre */
buffer=rand();
close(p1[0]);
close([p2[0]);
write(p1[1], buffer, (strlen(buffer)+1));
write(p2[1], buffer, (strlen(buffer)+1));
/* Esperamos al primer hijo */
waitpid(pid1, &status1, 0);
/* Esperamos al segundo hijo */
waitpid(pid2, &status2, 0);
printf("Soy el padre %dn", getpid());
}
}
return 0;
}
Tweet
m0skit0
Miembro de PLATA
Mensajes: 2337
Nacionalidad:
Re: Pipes entre procesos
«
Respuesta #1 en:
Domingo 19 de Octubre de 2008, 18:43 »
0
¡Bienvenido al foro, orilla!
En un primer vistazo, arregla estas dos cosillas:
Cita de: "orilla"
nbytes = read(p1[0], readbuffer, sizeof(readbuffer));
Como bien dices, el error está el readbuffer, ya que quieres que sea un
int
y no una cadena, así que deberías hacer:
Código: C
int
*
readbuffer
;
[
...
]
readbuffer
=
malloc
(
sizeof
(
int
)
)
;
[
...
]
nbytes
=
read
(
p1
[
0
]
,
readbuffer
,
sizeof
(
int
)
)
;
// O TAMBIÉN
int
readbuffer
;
[
...
]
nbytes
=
read
(
p1
[
0
]
,
&
readbuffer
,
sizeof
(
readbuffer
)
)
;
Cita de: "orilla"
write(p1[1], buffer, (strlen(buffer)+1));
Y aquí hay que pasarle la dirección del entero y no el entero en sí, es decir, el mismo fallo de antes:
Código: C
write
(
p1
[
1
]
,
&
buffer
,
(
strlen
(
buffer
)
+
1
)
)
;
Ah, ¡y la próxima vez usa las etiquetas de código!
Fr33k K0mpu73r
orilla
Nuevo Miembro
Mensajes: 4
Re: Pipes entre procesos
«
Respuesta #2 en:
Domingo 19 de Octubre de 2008, 18:57 »
0
Gracias. Tienes razon, hay que añadir el &, aunque me sigue dando el mismo error..en la linia del write (..) Dice:
proveta.c:63: aviso: declaración implícita incompatible de la función interna ‘strlen’
proveta.c:63: aviso: el paso del argumento 1 de ‘strlen’ crea un puntero desde un entero sin una conversión
Gracias
m0skit0
Miembro de PLATA
Mensajes: 2337
Nacionalidad:
Re: Pipes entre procesos
«
Respuesta #3 en:
Lunes 20 de Octubre de 2008, 00:24 »
0
Ah, no me había dado cuenta, jejeje. Es lo que tiene el copiar-pegar
sustituye el
strlen()
por
sizeof(int)
Fr33k K0mpu73r
orilla
Nuevo Miembro
Mensajes: 4
Re: Pipes entre procesos
«
Respuesta #4 en:
Lunes 20 de Octubre de 2008, 15:35 »
0
Muchas gracias!
orilla
Nuevo Miembro
Mensajes: 4
Re: Pipes entre procesos
«
Respuesta #5 en:
Miércoles 22 de Octubre de 2008, 16:26 »
0
Haber..ahora la practica se ha complicado un poquito, para variar.
Muchas gracias de nuevo!
Yo he pensado algo asi
Código: Text
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h> /* incluim les llibreries necessaries */
#include <fcntl.h>
#include <sys/wait.h>
#include <math.h>
int main(int argc, char *argv[])
{
pid_t pid1, pid2;
int status1, status2, nbytes,nbytes2,max=1;
int i=0;
int p1[2], p2[2], p3[2], p4[2];
int buffer1, buffer2;
int readbuffer1, readbuffer2,readbuffer3,readbuffer4;
void manejador(int sig)
{
close(p3[0]);
printf("Excepción capturadan");
printf("Enviando al padre la señal SIGUSR1 n");
int sig_num1=5;
write(p3[1], &sig_num1,sizeof(int));
}
void manejador2(int sig)
{
close(p4[0]);
printf("Excepción capturadan");
printf("Enviando al padre la señal SIGUSR2 n");
int sig_num2=6;
write(p4[1], &sig_num2,sizeof(int));
}
/*void RutinaTratSIGUSR1(int sig)
{
printf("Enviando SIGUSR1n");
}
void RutinaTratAlarm(int sig)
{
printf("Esperando 3 segundos n");
sleep(3);
}*/
if(pipe(p1) < 0)
{
perror( "Errorn");
}
if(pipe(p2) < 0)
{
perror( "Errorn");
}
if(pipe(p3) < 0)
{
perror( "Errorn");
}
if(pipe(p4) < 0)
{
perror( "Errorn");
}
printf("Soy el padre %dn", getpid());
pid1=fork();
if ( pid1<0)
{
perror("Se ha producido un error n");
}
if ( pid1 == 0 )
{ /* hijo */
close(p1[1]);
//0 = read
nbytes = read(p1[0], &readbuffer1, sizeof(readbuffer1));
printf("Numero recibido1: %d, n", readbuffer1);
while (readbuffer1>i)
{
printf("Soy el primer hijo %d, n", getpid());
printf(" Soy el padre %d,n",getppid());
i++;
//signal(SIGALRM, RutinaTratAlarm);
}
signal(SIGUSR1,manejador);
kill(getppid(),SIGUSR1);
}
else
{ /* padre */
pid2=fork();
if(pid2<0)
{
perror("Se ha producido un error n");
}
if ( pid2 == 0 )
{ /* segundo hijo */
close(p2[1]);
//0 = read
nbytes2 = read(p2[0], &readbuffer2, sizeof(readbuffer2));
printf("Numero recibido2: %d, n", readbuffer2);
while (readbuffer2>i)
{
printf("Soy el segundo hijo %d,n", getpid());
printf(" Soy el padre %d,n",getppid());
sleep(1);
i++;
}
signal(SIGUSR2,manejador);
kill(getppid(),SIGUSR2);
}
else
{ /* padre */
buffer1=5;
buffer2=3;
close(p1[0]);
close(p2[0]);
close(p3[1]);
close(p4[1]);
write(p1[1], &buffer1, sizeof(buffer1)); //Pipe al 1r hijo
write(p2[1], &buffer2, sizeof(buffer2)); //Pipe al 2o hijo
if(read(p3[0], &readbuffer3, sizeof(int)))
//Leer sigusr1
{
pause();
printf("SIGUSR1 recibido %d,n", readbuffer3);
write(p1[1], &buffer1, sizeof(int));
}
if(read(p4[0], &readbuffer4, sizeof(int))) //Leer sigusr2
{
printf("SIGUSR2 recibido %d,n", readbuffer3);
write(p2[1], &buffer1, sizeof(int));
}
/* Esperamos al primer hijo */
waitpid(pid1, &status1, 0);
/* Esperamos al segundo hijo */
waitpid(pid2, &status2, 0);
printf("Soy el padre %dn", getpid());
}
}
return 0;
}
«
última modificación: Viernes 24 de Octubre de 2008, 18:18 por orilla
»
m0skit0
Miembro de PLATA
Mensajes: 2337
Nacionalidad:
Re: Pipes entre procesos
«
Respuesta #6 en:
Jueves 23 de Octubre de 2008, 10:37 »
0
orilla, ¿qué tal si lo depuras y reduces el código a las líneas donde creas que puede estar el problema? Así es más fácil para todos solucionarlo. Un saludo.
Fr33k K0mpu73r
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Pipes entre procesos