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);
因此,这两个函数都需要一个指针作为它们的第二个参数。所以你必须传递一个内存地址给他们。
注意: 您尝试通过将整数强制转换为 int*
来创建一个指针。实际上,int*
在声明或原型中表示指针,但是当您在变量名前使用*
时,它表示内容 这个变量。符号&
用来表示变量的地址。
首先,正确调用 read()
和 write()
将包括获取指向您的变量的指针并传递它。
其次,您从标准输出(文件描述符 1)读取和写入,而不是您的描述。根据 stdout
而不是 stdin
读取并不重要
第三,最好使用unistd.h
定义(STDOUT_FILENO
、STDIN_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
.
这是我作为简单实验的一部分所做的事情;
#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);
因此,这两个函数都需要一个指针作为它们的第二个参数。所以你必须传递一个内存地址给他们。
注意: 您尝试通过将整数强制转换为 int*
来创建一个指针。实际上,int*
在声明或原型中表示指针,但是当您在变量名前使用*
时,它表示内容 这个变量。符号&
用来表示变量的地址。
首先,正确调用 read()
和 write()
将包括获取指向您的变量的指针并传递它。
其次,您从标准输出(文件描述符 1)读取和写入,而不是您的描述。根据 stdout
而不是 stdin
读取并不重要
第三,最好使用unistd.h
定义(STDOUT_FILENO
、STDIN_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
.