如何修复在 C 程序中使用管道写入或读取的数据给出错误的输出?

How to fix data write or read using pipe in c program is giving wrong output?

我正在尝试在子进程中获取整数输入并使用 pipe() 将其发送到父进程

但我每次在父进程中都会收到垃圾值。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include<sys/wait.h>
int main(int argc, char *argv[])
{
    pid_t pid;
    int fd[2];
    char *args[] = {"", NULL};
    int cnum,pnum;
    
    pid = fork();
    if (pid < 0)
    {
        perror("fork");
        exit(1);
    }
    if(pipe(fd) == -1)//fd[0] for read fd[1] for write
    {
        perror("pipe");
        exit(1);
    }
    if(pid == 0)
    {
        close(fd[0]);
        printf("\n**In the child process**\n");
        printf("Enter Number : ");
        scanf("%d",&cnum);
        write(fd[1],&cnum,sizeof(int));
        close(fd[1]);

    }
    else
    {
        wait(NULL);
        close(fd[1]);
        printf("\n**In the parent precess**\n");
        read(fd[0],&pnum,sizeof(int));
        close(fd[0]);
        
        printf("Number recieved = %d\n",pnum);
        printf("PID = %d\n", getpid());
        execv("./sayHello", args);
        printf("Error");
    }
}

以上代码的输出

**In the child process**
Enter Number : 212
**In the parent precess**
Number recieved = 1036468968
PID = 22528
Hillo Amol
PID = 22528

我输入了 212,但在父级中收到了 1036468968。

您在创建管道 FD 之前fork调用。调用fork后,父子都创建了自己的一对管道FD,它们之间没有共享管道。

在 fork 之前创建管道,它可以工作。

正如 drorfromthenegev 所说,问题是由于我在 fork() 之后调用 pipe()。

所以我先调用 pipe() 然后调用 fork() 并且它起作用了..

可行的解决方案

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include<sys/wait.h>
int main(int argc, char *argv[])
{
    pid_t pid;
    int fd[2];
    char *args[] = {"", NULL};
    int cnum,pnum;
    
    if(pipe(fd) == -1)//fd[0] for read fd[1] for write
    {
        perror("pipe");
        exit(1);
    }
    pid = fork();
    if (pid < 0)
    {
        perror("fork");
        exit(1);
    }
    
    if(pid == 0)
    {
        close(fd[0]);
        printf("\n**In the child process**\n");
        printf("Enter Number : ");
        scanf("%d",&cnum);
        write(fd[1],&cnum,sizeof(int));
        close(fd[1]);

    }
    else
    {
        wait(NULL);
        close(fd[1]);
        printf("\n**In the parent precess**\n");
        read(fd[0],&pnum,sizeof(int));
        close(fd[0]);
        
        printf("Number recieved = %d\n",pnum);
        printf("PID = %d\n", getpid());
        execv("./sayHello", args);
        printf("Error");
    }
}