c - 使用管道写入和读取 Int 数组

标签 c arrays pipe fork

我正在尝试使用管道制作一个简单的程序。该程序必须在父级中请求一个整数数组,并将其发送给子级,子级必须对数组进行排序并将其发送回父级。 问题是我不确定在通过管道发送后如何读取子项中的数组值。

按照我的代码:

#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;
}

最佳答案

你的程序运行良好,除了一些像

这样的错误
 for(int i = 0; i<5; i++){
        printf("%d \n", &numeros_recebidos[i]); // why &, remove it bcz you are printing data not scanning.

child 和 parent 如何通过管道通信:

关于 pipe() 有一些重要的事情:

1)pipe() 系统调用将创建两个名为fd[0]fd1[1] 的端点。一个保留用于阅读目的,另一个保留用于编写目的。

2)pipe 是一个单向 IPC 即一次你只能从管道的一端读取或写入,两者不能同时进行。

3)只有相关进程(如子进程和父进程)可以通过pipe()进行通信。

父进程:父进程正在将整数数组写入fd[1]。一旦完成,数据就在 pipe() 的写入端。接下来是子作业从这里读取数据,所以让我们跳到子进程。

                            pipe(uni-directional)
                       |---------------------------| 
parent is writing----->|                           |<---------
                       |---------------------------| 
                     fd[1]                        fd[0]

        write(fd[1], numeros, sizeof(numeros) + 1);

子进程:父进程已将 int 数组放入 fd[1],现在子进程必须从 fd[0] 读取并打印它。

          pipe(uni-directional)
      |---------------------------| 
----->|                           |<-----child process is reading data & storing in numeros_recebidos
      |---------------------------| 
     fd[1]                       fd[0]

  read(fd[0], numeros_recebidos, sizeof(numeros_recebidos));

我希望它有助于理解 pipe() 的工作原理。

关于c - 使用管道写入和读取 Int 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47371735/

相关文章:

linux - 为什么管道上的这个 strace 没有完成

python - 获得所需数据后,如何关闭 Python 2.5.2 Popen 子进程?

c++ - 如何将管道作为文件传递给 C 应用程序?

C - 如何遍历 ADT 结构?

c - 数独网格生成器

java - 如何用不同类的对象填充数组?详情如下

javascript - 如何创建带有复选框的字符串?

python - 将 3 维 numpy 数组传递给 C

c - 在初始化固定大小的 char 数组时没有足够的空终止符空间时没有编译器错误

ruby-on-rails - HABTM 与数组的关系