Usar tubería para pasar valores enteros entre padres e hijos

Estoy un poco confundido sobre cómo usar pipe () para pasar valores enteros entre dos procesos.

En mi progtwig, primero creo una tubería, luego la bifurco. ¿Supongo que tengo “dos” pipas entonces?

Por lo que entiendo, esta es mi tarea. Mi padre pasa por un bucle for que comprueba un valor entero “i” para una determinada operación, aumenta una variable de conteo y guarda el valor en una matriz. Después de cada control, mi padre debe pasarle un valor entero, “yo” a mi hijo a través de una tubería. Mi hijo usa ese valor entero, verifica el valor y debe boost una variable de conteo y guardar el resultado en una matriz [compartida?]. Finalmente; el niño debe devolver su conteo final al padre, quien luego imprime los dos conteos y el conjunto “Compartido”.

-> No estoy seguro de que necesite tener una matriz compartida o guardar los resultados en absoluto. Puede que solo necesite los conteos, la tarea era ambigua y estoy esperando una respuesta del profesor. También; ¿Puedo hacer una matriz compartida entre procesos? Suena como un comienzo de algún problema para mí.

-> Aquí están mis preguntas: una; ¿Cómo uso tubos para enteros? Solo los he visto para arreglos de personajes y las respuestas anteriores no parecen pensar que esto sea posible o legal … No estoy seguro. No había resolución que pudiera encontrar en eso.

-> ¿Cómo utilizo un tubo unidireccional para pasar enteros a un niño? Y que el niño devuelva algo? No estoy seguro de cómo puedo … diferenciar entre las dos tuberías. Sí sé “[o creo saber] que tengo que cerrar una parte no utilizada de cada tubería para evitar” Algún problema vago “.

Perdón por las preguntas tontas; Todavía no me han enseñado procesos (aparte de la horquilla) o tuberías (en absoluto) en esta clase, ¡así que no estoy seguro de por dónde empezar!

Aquí hay partes de mi código: no es bonito y no funciona, y no lo espero. Es más un marcador de posición de shell. Una vez que descubro cómo usar una tubería, probablemente haré que el código tenga sentido.

int main(void) { int fd[2]; pid_t childpid; pid_t parentpid; int i; int threecount = 0; int fivecount = 0;; int results [MAXSIZE]; parentpid = getpid(); //Get current process ID number pipe(fd); childpid = fork(); if(childpid == 0){ close(fd[0]); //Closing this for some other reason } int j = 0; if(childpid > 0) close(fd[1]); //Closing this for some reason if( childpid == -1 ) { perror("Failed to fork\n"); return 1; } if (childpid > 0) { for(i = 1; i < MAXSIZE;i++) { if(i % 5 == 0) { fivecount++; i = results[j]; j++; wait(NULL); } } } else if (childpid == 0) { if(i % 3 == 0) //This i here should probably be the i value above, piped to the child { threecount++; i = results[j]; //This should be part of th pipe j++; //Trying to keep count of that shared array, not really the right way to do it though. } } printf("%d %d \n", fivecount,threecount); return 0; 

}

Esto es tan cojo (y no verifica errores, por cierto) una muestra como puedo reunir para usar un conducto para enviar int de un proceso padre a un proceso hijo, donde el hijo fue lanzado desde fork (). Se vuelve más complicado (obviamente) enviar y recibir datos, pero no puedo hacer todo por ti. Esto simplemente bifurca y espera una int (en realidad, la cantidad de bytes que utiliza un int) del elemento secundario.

Actualización: se agregó un ejemplo de comunicación bidireccional de envío + respuesta después de este. Vea el segundo listado de códigos para más información.

Espero eso ayude.

 #include  #include  #include  int main(int argc, char *argv[]) { int fd[2]; int val = 0; // create pipe descriptors pipe(fd); // fork() returns 0 for child process, child-pid for parent process. if (fork() != 0) { // parent: writing only, so close read-descriptor. close(fd[0]); // send the value on the write-descriptor. val = 100; write(fd[1], &val, sizeof(val)); printf("Parent(%d) send value: %d\n", getpid(), val); // close the write descriptor close(fd[1]); } else { // child: reading only, so close the write-descriptor close(fd[1]); // now read the data (will block) read(fd[0], &val, sizeof(val)); printf("Child(%d) received value: %d\n", getpid(), val); // close the read-descriptor close(fd[0]); } return 0; } 

Salida:

 Parent(5943) send value: 100 Child(5945) received value: 100 

Actualización: ampliado para incluir envío + respuesta utilizando dos conjuntos de tubos

 #include  #include  #include  #include  // some macros to make the code more understandable // regarding which pipe to use to a read/write operation // // Parent: reads from P1_READ, writes on P1_WRITE // Child: reads from P2_READ, writes on P2_WRITE #define P1_READ 0 #define P2_WRITE 1 #define P2_READ 2 #define P1_WRITE 3 // the total number of pipe *pairs* we need #define NUM_PIPES 2 int main(int argc, char *argv[]) { int fd[2*NUM_PIPES]; int val = 0, len, i; pid_t pid; // create all the descriptor pairs we need for (i=0; i 

(comstackr con, por ejemplo, gcc thisfile.c -o test )

Salida

 Parent(2794): Sending 42 to child Child(2797): Received 42 Child(2797): Sending 84 back Parent(2794): Received 84