【发布时间】:2017-10-20 15:19:29
【问题描述】:
现在我有一个如下程序:
#include <stdio.h>
#include <unistd.h>
int main(){
char str[200];
while(read(0, str,10)>0){
printf("%s", str);
}
printf("good\n");
scanf("%s", str);
printf("%s\n", str);
}
当收到EOF时,这个程序会打印good,然后继续接受我的下一个输入,然后打印出来,以防直接运行。
我要做的是与另一个 python 代码交互:
from pwn import *
r = process('./test')
r.send('123')
print r.recv(1000)
r.send('\x04')
print r.recv(1000)
但无论如何,除非我关闭连接,否则我无法退出 while 循环。但是如果我关闭连接,我将无法发送最后一个输入。 我在某处发现 '\x04' 代表 EOF。但它似乎不起作用。
我想知道我应该怎么做才能跳出循环然后发送最后一个输入。
【问题讨论】:
-
顺便说一句,但您的 C 程序中的
str缓冲区不会以空值终止。确保在每次read调用后设置str[N]='\0'。 -
EOF是 notchar(所以不能“发送”它)。这是一种状态。read()检测“文件结束”是否以及何时关闭输入流。您可能想发明一种不同的协议。 -
“当收到EOF时,这个程序会打印好,然后继续接受我的下一个输入” - 当你遇到EOF时,就是没有“下一个输入”。
-
但是你可以测试一下:当按下 ^D 时,如果我手动运行它,它会打印“good”并等待我的下一个输入
-
你知道 EOF 意味着文件结束,对吧?将程序设计为使用 EOF 作为记录分隔符是非常不寻常的,因为它实际上不能存储在文件中。为什么不使用换行符?