c++ - 从用户读取整数并写入子管道,然后从中读取父管道

标签 c++ c unix pipe read-write

我正在尝试在管道中进行简单的读/写 但它给了我错误

这是我的代码:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<fcntl.h>
#define BUFSIZE 80

int main()  
{
    int fd[2],n,i,h;
    char buf[BUFSIZE];
    pipe(fd);   
    switch(fork())
    {   
        case -1 :printf("Fork Error");
            exit(0);
        case 0  :close(fd[0]);  
            printf("Enter N :");
            scanf("%d",&n);
            write(fd[1],&n,sizeof(n));
            close(fd[1]);
        case 1  :close(fd[1]);  
            n=read(fd[0],&h,sizeof(h));
            for(i=1;i<=h;i++)
            {
                if(i%2==1)
                {
                    write(1,&i,n);
                }
            }
            close(fd[0]);
    }
    exit(0);
}

在这段代码中: child 的 fd[0] 指针被关闭并从 child 的 fd[1] 指针写入,然后父从 fd[1] 指针读取并将其存储在 h 变量中,然后变量 i 的值进入 STDOUT_FILENO (1) 并在标准输出上显示输出

输出:

kartik@ubuntu:~/Desktop/isp$

Enter N :6

6: command not found

最佳答案

这里有几个问题:

  • 您在子进程中提示输入 N,但父进程是从终端接收输入的进程。因此,当您输入“6”时,父进程已经退出,您正在向 shell 输入该值。将 printfscanf 移到 fork 之前,您应该能够正确读取该值。
  • fork() 从父级返回时,您的 case 1 将不会被输入,这似乎是您的意图。 fork() 将子进程的 pid 返回给父进程。因为特殊的 init 进程的 pid 为 1,所以这永远不会成立。将 case 1: 更改为 default 以处理父进程。
  • 您没有在 switch case 的末尾使用 break。在 C 语言中,switch cases “fall through”,意味着一旦一个 case 的语句完成,它将继续运行下一个 case 的语句。每个案例末尾的 break 语句可防止这种情况发生。

通过这些更正,您现在拥有:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<fcntl.h>
#define BUFSIZE 80

int main()
{
    int fd[2],n,i,h;
    pid_t pid;     // to capture the child pid
    char buf[BUFSIZE];
    // prompt for N before forking
    printf("Enter N :");
    scanf("%d",&n);
    pipe(fd);
    switch((pid=fork()))   // saving the child pid in case we want to use it later
    {
        case -1 :
            printf("Fork Error");
            exit(0);     // no break needed here because of exit
        case 0  :
            close(fd[0]);
            write(fd[1],&n,sizeof(n));
            close(fd[1]);
            break;       // end of case 0
        default :
            close(fd[1]);
            n=read(fd[0],&h,sizeof(h));
            printf("h=%d\n",h);
            for(i=1;i<=h;i++)
            {
                if(i%2==1)
                {
                    //write(1,&i,n);
                    printf("%d\n",i);
                }
            }
            close(fd[0]);
            break;      // end of default case
    }
    exit(0);
}

关于c++ - 从用户读取整数并写入子管道,然后从中读取父管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32679156/

相关文章:

unix - 如何从 Unix 命令行递归解压目录及其子目录中的文件?

c++ - std::get() 如何与 std::tuple 一起工作?

c++ - 手动对象所有权与智能指针

c++ - 虚继承和基类的基类

c++ - 如何知道我的编译器自动完成了哪些优化

c - 强制每 1 秒调用一次警报处理程序(在 C 中)

c++ - 从字节数组创建 CImg<uint8_t>?

c - 程序对于较小的值工作正常,但对于较大的值抛出段错误

c - 在 linux 中访问 USB 闪存中的一个扇区

将可执行文件转换为代码