写入文件描述符并立即从中读取

问题描述 投票:1回答:1

[今天,我遇到了一些看起来很奇怪的代码,乍一看,它对我来说并不明显。

  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"

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

写入文件描述符然后立即从文件描述符中读取的用例是什么?似乎是使用文件描述符复制数据的复杂方法。还是我不太了解此代码,send()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;
}
c buffer system-calls file-descriptor
1个回答
1
投票

send()send()函数用于套接字(recv():在套接字上发送消息-recv():从连接的套接字接收消息)。通常也请参见send的POSIX描述。

套接字文件描述符是双向的,您可以在它们上读写,而不能读取所写的内容(与管道文件描述符不同。

© www.soinside.com 2019 - 2024. All rights reserved.