read() 和 write() 未按预期工作

read() and write() not working as expected

这是我作为简单实验的一部分所做的事情;

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

int fun()
{
 int d=10;
 write(1,(int*)d,sizeof(d));
}

int main()
{ 
 int x;
 fun();
 read(1,(int*)x,4);
 printf("x=%d\n",x);
 return 0;
}

如您所见,我正在尝试通过 IO 流(IO 文件)stdout 访问 fun() 函数中 d 的值;我也尝试使用 stdin 但问题是 x 值没有改变。 (我在网上试过 IDE。)但根据我的思路,它应该更改为 d.

的值

谁能帮我看看为什么它不这样做?

读写需要指针。在您的情况下,它是 &d&x。将 int 转换为 int* 通常没有意义。

替换行:

write(1,(int*)d,sizeof(d));

与 :

write(1, &d, sizeof(d));

行:

read(1,(int*)x,4);

与 :

read(1, &x, 4);

修改原因:

如您在 this reference for read() 中所见,函数 read 的原型是:

ssize_t read(int fd, void *buf, size_t count);

函数 write 的原型分别是:

ssize_t write(int fd, const void *buf, size_t count); 

如图this reference for write().

因此,这两个函数都需要一个指针作为它们的第二个参数。所以你必须传递一个内存地址给他们。


注意: 您尝试通过将整数强制转换为 int* 来创建一个指针。实际上,int*在声明或原型中表示指针,但是当您在变量名前使用*时,它表示内容 这个变量。符号&用来表示变量的地址。

首先,正确调用 read()write() 将包括获取指向您的变量的指针并传递它。

其次,您从标准输出(文件描述符 1)读取和写入,而不是您的描述。根据 stdout 而不是 stdin 读取并不重要

第三,最好使用unistd.h定义(STDOUT_FILENOSTDIN_FILENO等),而不是直接使用fd数字。

int d, x;
write(STDOUT_FILENO, &d, sizeof(d));
read(STDOUT_FILENO, &x, sizeof(x));
printf("x=%d\n", x);

关于我认为您最初的想法:当您从 stdout(或 stdin)读取时,数据来自键盘输入,而不是打印到更早的屏幕 - 所以 d 的值不应该达到 x.