私はパイプを使って簡単なプログラムを作ろうとしています。プログラムは、親の整数配列を要求し、それを子に送信しなければなりません。子は、配列をソートしてそれを親に返さなければなりません。 問題は、パイプを介して送信した後、どのように子の配列値を読み取るのか分かりません。パイプを使ってIntの配列を書き込んで読み込み
私のコードは、次のとおりです。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main() {
int fd[2];
pid_t pid;
/* Verifica se ocorreu erro (-1) ao criar o PIPE */
if(pipe(fd) == -1){
perror("pipe");
exit(1);
}
/* Verifica se o fork foi realizado com sucesso > 0 */
if((pid = fork()) < 0){
perror("fork");
exit(1);
}
if(pid > 0){
printf("-----------------------------------------------\n");
printf(" PROCESSO PAI \n");
printf("-----------------------------------------------\n");
/* Como vamos ESCREVER do lado do PAI, fechamos a LEITURA */
close(fd[0]);
int numeros[5];
for (int i = 0; i < 5; i++){
printf("\nDigite o numero [%d]: ", i);
scanf("%d", &numeros[i]);
}
/* Escrevendo o array no PIPE */
write(fd[1], numeros, sizeof(numeros) + 1);
printf("\nEnviando numeros para meu Filho...\n");
exit(0);
}else{
int numeros_recebidos[5];
/* Como vamos LER do lado do FILHO, fechamos a ESCRITA*/
close(fd[1]);
/* Lendo a mensagem que foi enviada pelo FILHO */
read(fd[0], numeros_recebidos, sizeof(numeros_recebidos));
printf("\n-----------------------------------------------\n");
printf(" PROCESSO FILHO \n");
printf("-----------------------------------------------\n");
printf("\nNumeros Recebidos, Ordenando...\n");
for(int i = 0; i<5; i++){
printf("%d \n", &numeros_recebidos[i]);
}
}
return 0;
}
2つのパイプが必要です.1つは、親にデータを子に送信するパイプと、子が親にデータを送信するパイプです。それ以外のものは信頼できません。親はそれが書いたデータを読み終えるかもしれない。せいぜい、「読み取る整数の数とそのデータを子に送信する」などのプロトコルを持つ必要があります。もう一度寝る。子どもからの応答を読んでください。それは形式的に保証されていません。プロセスのスケジューリングは予測不可能であり、システムが耐え難いほどビジー状態であれば、子どもは1秒間スケジュールされないかもしれません(ただし、問題はほとんどありません)。 –