gpt4 book ai didi

c - 为什么我可以使用指针作为write()的缓冲区,而需要使用指针地址作为read()的缓冲区?

转载 作者:太空宇宙 更新时间:2023-11-04 03:06:02 26 4
gpt4 key购买 nike

我正在尝试将单个字符从父进程传输到子进程。通常这是用一个简单的变量完成的,但我正在用一个指针来尝试。如果它是用一个简单的变量 (var) 完成的,write() 和 read() 的缓冲区参数都是 &var,但是当我使用指针 (* ptr),read()的参数是ptr,write()的参数是&ptr

我是 C 的新手,我不太明白为什么会这样。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {

char *chPtr;
int fd[2];
pid_t pid;

char value = 'z';

pipe(fd);
pid = fork();

if (pid) { // Parent
close(fd[0]);
chPtr = &value;
write(fd[1], chPtr, 1);
close(fd[1]);
}

if (! pid) { // Child
close(fd[1]);
read(fd[0], &chPtr, 1);
printf("the result is %c\n", (int)chPtr);
close(fd[0]);
}
return 0;
}

最佳答案

您的子实现没有达到您的预期。虽然它有效,但它确实是一个设计错误。

read() 函数读取调用者分配的缓冲区。因为您将 &chPtr 传递给 read(),所以您将指针的内存用作缓冲区,这恰好起作用,因为您只读取一个适合指针内存的字符。

通常你会想要这样的东西:

if (! pid) {   // Child
char buf[1];
close(fd[1]);
read(fd[0], buf, 1);
printf("the result is %c\n", buf[0]);
close(fd[0]);
}

关于c - 为什么我可以使用指针作为write()的缓冲区,而需要使用指针地址作为read()的缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5113582/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com