所以我试图在 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;