【问题标题】:read() and write() not working as expectedread() 和 write() 没有按预期工作
【发布时间】:2017-02-08 07:04:27
【问题描述】:

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

#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 的值。

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

【问题讨论】:

  • 请向我们展示输入和预期输出的示例。
  • 即使你修复了调用序列(将指针传递给read()write()),你也无法阅读fun() 写的内容。是的,你经常可以从标准输出中读取——但除非你做了一些花哨的事情(I/O 重定向等),否则从标准输出中读取与从标准输入中读取是一样的,这意味着它将读取你在键盘上键入的内容.您写入标准输出的内容将显示在屏幕上(除非您进行了一些 I/O 重定向)并且不会成为输入数据的一部分。
  • @JonathanLeffler 怎么做?
  • @SurajJain:怎么办?
  • @SurajJain 到read() 你做了什么write() 你需要它们都连接到同一个东西的东西,例如管道、套接字或文件。所以我建议你open一个文件,write它,seek回到开头,最后read你写的。

标签: c stdout


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    其次,您从标准输出(文件描述符 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

    【讨论】:

    • 感谢更正,编辑了答案。其他答案只谈论我回答的“第一”点。还有第二个,第三个,并尝试实际回答我对所提问题的解释
    • 你现在正在阅读STDOUT_FILENO,可能会指出这一点:D
    • 这就是原始问题中的代码所做的,这也是我回答的“第二点”所要说的
    【解决方案3】:

    换行:

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

    【讨论】:

      猜你喜欢
      • 2014-10-11
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      • 2016-08-13
      • 2013-07-07
      • 2012-12-05
      • 2017-05-22
      • 2019-07-28
      相关资源
      最近更新 更多