首页 > 解决方案 > 写入文件描述符并立即从中读取

问题描述

今天我遇到了一些看起来很奇怪的代码,乍一看我并不清楚它的作用。

  send(file_desc,"Input \'y\' to continue.\t",0x18,0);
  read(file_desc,buffer,100);
  iVar1 = strcmp("y",(char *)buffer);
  if (iVar1 == 0) {
    // some more code
  }

似乎正在将文本字符串写入文件描述符。紧接着,它从该文件描述符读取到缓冲区。它会比较写入缓冲区的文本是否为"y".

我的理解(如果我错了,请纠正我)是它将一些作为文本字符串的数据写入文件描述符,然后文件描述符充当您写入它的任何内容的临时存储位置。之后,它将文件描述符中的数据读取到缓冲区中。它实际上是同一个文件描述符。这似乎是使用文件描述符将数据从文本字符串复制到缓冲区的原始方式。为什么不直接使用 astrcpy()呢?

写入文件描述符然后立即从中读取的用例是什么?使用文件描述符复制数据似乎是一种复杂的方式。或者也许我对这段代码的理解不够好,这个 asend()和 a 的序列是做什么的read()

并假设这段代码使用文件描述符将文本字符串复制"Input \'y\' to continue.\t"到缓冲区中,为什么他们将它与字符串进行比较"y"?每次都应该是假的。

我假设写入文件描述符的任何数据都保留在该文件描述符中,直到它被读取。所以这里似乎send()被用来将字符串写入,并read()用于将其读回。

里面man send说:

 The only difference between send() and write(2) is the presence of flags.  With a zero
       flags argument, send() is equivalent to write(2).

他们为什么要使用send()而不是write()?这段代码真是令人难以置信。


编辑:这是此代码最初来自的完整功能:

void send_read(int file_desc)

{
  int are_equal;
  undefined2 buffer [8];
  char local_28 [32];

                    /* 0x6e == 110 == 'n' */
  buffer[0] = 0x6e;
  send(file_desc,"Input \'y\' to continue.\t",0x18,0);
  read(file_desc,buffer,100);
  are_equal = strcmp("y",(char *)buffer);
  if (are_equal == 0) {
    FUN_00400a86(file_desc,local_28);
  }
  else {
    close(file_desc);
  }
  return;
}

标签: cbuffersystem-callsfile-descriptor

解决方案


和函数用于套接字( :在套接字send()发送消息 - :从连接的套接字接收消息)。另请参阅一般的Sockets的 POSIX 描述。recv()sendrecv

套接字文件描述符是双向的——您可以在它们上读写。与管道文件描述符不同,您无法阅读您编写的内容。使用管道,写入管道写入端的进程可以从管道的读取端读取它写入的内容——如果另一个进程没有先读取它。当一个进程在套接字上写入时,该信息会发送到对等进程并且不能被写入者读取。


推荐阅读