我正在尝试通过父子函数从管道写入和读取消息,但一直遇到“参数太少”的问题

问题描述 投票:0回答:0

所以我试图在 Unix 中编写一个程序,允许我使用管道将消息写入父函数并从子函数读取它,反之亦然。我获得了允许我成功写入父级并从子级读取的代码,但是当尝试修改代码以允许相反时,我不断收到“参数太少”错误,因为子级试图编写它的消息.具体来说,我将用于允许父进程写入子进程的函数复制到子进程中,以便两个函数都关闭管道的“读取”端,将消息作为传入变量写入管道,关闭“写”端,读取管道中的消息,将其传递给读取函数,关闭管道的“读取”端,然后打印传递给读取函数的任何内容。这一切对我来说都是有意义的,但这可能只是因为我无法理解一些简单的东西。

首先,我尝试添加第二条消息让孩子写入管道和一个单独的读取函数,但经过深思熟虑后,第二个读取函数没有意义,因为它所做的只是读取管道中的内容,这将根据 write 函数写入的内容而变化。我还尝试让父母和孩子都阅读相同的消息,除了父母会打印“parent: msg”而孩子会打印“child: msg”,但这并没有解决“参数太少”的问题对于子函数,我不明白,因为传递给子函数的参数与传递给子函数的参数完全相同,除了传递给子函数的 msg2 而不是 msg,但是父函数工作而子函数不工作。我的理解是传递给函数的参数数量应该相同,但这显然是错误的。这是我的澄清代码:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <wait.h>

#define BUFFER_SIZE 40
#define READ_END 0
#define WRITE_END 1

int main(void)
{
   char write_msg[BUFFER_SIZE] = "People all over the world, join hands!";
   char write_msg2[BUFFER_SIZE] = "Start a Love Train (Love Train)!";
   char read_msg[BUFFER_SIZE];
   pid_t pid;
   int fd[2];

   if (pipe(fd) == -1) {
        fprintf(stderr,"Pipe failed");
        return 1;
   }

   pid = fork();

   if (pid < 0) {
        fprintf(stderr, "Fork failed");
        return 1;
   }

   if (pid > 0) {
        close(fd[READ_END]);
        write(fd[WRITE_END], write_msg, strlen(write_msg)+1);

        close(fd[WRITE_END]);

        read(fd[READ_END], read_msg, BUFFER_SIZE);
        close(fd[READ_END]);

   printf("parent: %s\n",read_msg);
   wait(NULL);
   }
   else {
        close(fd[READ_END]);
        write(fd[WRITE_END], write_msg2, strlen(write_msg2)+1);
        close(fd[WRITE_END]);

        read(fd[READ_END], read_msg, BUFFER_SIZE);
        close(fd[READ_END]);

   printf("child: %s\n",read_msg);
   }

   return 0;
unix pipe fork
© www.soinside.com 2019 - 2024. All rights reserved.