【发布时间】:2020-04-18 05:20:21
【问题描述】:
今天我遇到了一些看起来很奇怪的代码,乍一看我并不清楚它的作用。
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;
}
【问题讨论】:
-
您需要包含更多代码。“文件描述符”并不总是意味着磁盘上的实际文件。它更可能是一个套接字、管道或其他一些伪文件。如果代码实际上是磁盘上的文件,则代码将没有意义。
-
@JonathanLeffler 这让我明白了一点。那么它是否使用相同的文件描述符来将消息写入另一个服务器,并且还使用它来检索服务器的响应?这将解释发送的文本字符串和以下
strcmp()。我应该提一下,这段代码确实与 somewhere 的服务器通信。
标签: c buffer system-calls file-descriptor