c - 不明白管道是如何工作的。 (UNIX 进程之间的共享内存)

标签 c ubuntu unix operating-system pipe

我不明白管道在 UNIX 中是如何工作的,我做了这段代码,偶然发现了一个奇怪的事实。练习的痕迹可以在代码的顶部找到。我会解释我无法得到的东西。在父进程中,当我想打印管道中的值时,“i”变量开始的值可以是任何数字。我输入了“4”,但它适用于每个数字 2、3、4 excetera。
怎么可能每次都有效?

/*****************************************************************
    The candidate should complete the program provided, implementing
    the main.
    The program creates a child process; the child process reads
    from the keyboard an integer N >= 0, and transmits the values N, N-1, N-2, N-3, ..., 0
    (inclusive) to the parent process via a pipe.
    The father process reads from the pipe the values transmitted by the child process
    and prints them, until it receives the value 0; then the father process
    process waits for the termination of the child process and terminates.
    
    Example:
    I am the child process. Enter a number >=0: 4
    I am the father process. I have received: 4
    I am the father process. I have received: 3
    I am the father process. I have received: 2
    I am the father process. I have received: 1
    I am the father process. I have received: 0
    I am the father process. The son has finished.
    
******************************************************************/
    
    
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <unistd.h>
#include <sys/wait.h>
    
int main(int argc, char *argv[]) 
{
    
    int fd[2];
    int num, i;
    //Pipe creation
    if(pipe(fd)<0)
    {
        printf("Pipe creation failed\n");
        return 1;
    }
    //Creating a child process
    pid_t pid=fork();
    //Fork check
    if(pid<0)
    {
        printf("Fork failed\n");
        return 1;
    }
    //Entering the child process
    else if(pid==0){
        close (fd[0]);  // Not interested in reading
        printf("I am the child process\n");
        //Acquiring a number from input
        printf("Give me a number: ");
        scanf("%d", &num);
        //Sending the numbers trough a pipe
        for(i=num; i>=0; i--)
        {
            int sent=write(fd[1], &i, sizeof(num));
            //Check on the number of bytes the function wrote
            if(sent<0 || sent<sizeof(num))
            {
                printf("Error when sending\n");
                return 1;
            }
        }
        close (fd[1]);
        return 0;
    }
    //Entering the father process
    if(pid>0)
    {
        //Father process
        wait(NULL);
        close (fd[1]);// Not interested in writing
        for(i=4;i>=0;i--)//4 is a random number and it still works
        {
            int ricevuti=read(fd[0], &i, sizeof(num));
            //Check on the number of bytes the function read
            if(ricevuti<0 || ricevuti<(sizeof(num)))
            {
                printf("Error when receiving\n");
                return 1;
            }
            //Printing the values read by the function
            else
            {
                printf("I am the father process and i received: %d\n", i);
            }
        }
        printf("The child process has terminated\n");
    }
    close (fd[0]);
    return 0;
}

最佳答案

它适用于任何数字的原因是因为您正在从管道读取 for 使用的迭代变量。环形。所以即使你从 i = 4 开始, 第一个 read(fd[0], &i, sizeof(num))将改变i到 child 发送的起始号码。
您应该阅读 num ,而不是 i .父亲代码应该是:

    //Entering the father process
    if(pid>0)
    {
        //Father process
        wait(NULL);
        close (fd[1]);// Not interested in writing
        for(i=4;i>=0;i--)//4 is a random number and it still works
        {
            int ricevuti=read(fd[0], &num, sizeof(num));
            //Check on the number of bytes the function read
            if(ricevuti<0 || ricevuti<(sizeof(num)))
            {
                printf("Error when receiving\n");
                return 1;
            }
            //Printing the values read by the function
            else
            {
                printf("I am the father process and i received: %d\n", num);
            }
        }
        printf("The child process has terminated\n");
    }

关于c - 不明白管道是如何工作的。 (UNIX 进程之间的共享内存),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69757979/

相关文章:

c - 从结构体中的函数指针访问数据成员

java - 是否必须在 linux 发行版中使用 open jdk 而不是 oracle 网站上可用的 jdk 版本

c - 如何简化这段代码逻辑? (有时反转条件)

由函数修改的字符指针将无法正确显示更新字符串值

android - 无法在 ubuntu 上的 android studio 上运行程序 sdk 路径

ubuntu - 如何在 Ubuntu 中找到要降级的以前版本的软件包?

file - 如何对目录中的所有文件进行排序?

shell - 如何在unix中每行末尾添加文本

linux - 值未在 while 循环内分配

c - 如何运行这个程序?