read()和write()没有按预期工作

时间:2017-02-08 07:04:28

标签: c stdout

这是我在简单实验中所做的事情;

#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文件)d访问fun()函数中的stdout值;我也尝试使用stdin,但事情是x值没有变化。 (我在在线IDE中尝试过。)但是根据我的思维流,它应该更改为d的值。

任何人都可以帮我看看为什么不这样做?

3 个答案:

答案 0 :(得分:3)

读取和写入需要指针。在您的情况下,它是&d&x。将int投射到int*通常没有任何意义。

答案 1 :(得分:2)

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

其次,您从stdout(文件描述符1)读取和写入,而不是您的描述。如果您从stdout而不是stdin读取,则无关紧要 https://stackoverflow.com/a/7680234/2543937

第三,最好使用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

答案 2 :(得分:1)

替换行:

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

with:

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

和行:

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

with:

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*表示声明或原型中的指针,但是当您在变量名称前面使用*时,它表示此内容变量。符号&用于表示变量的地址。