我想从标准输入字符中读取字符并仅使用系统调用将其与不同的字符进行比较,我的问题是,给定代码:
#include "util.h"
#define STDOUT 1
#define STDIN 1
#define SYS_READ 3
#define SYS_WRITE 4
#define SYS_OPEN 5
#define SYS_CLOSE 6
#define SYS_LSEEK 19
int main (int argc , char* argv[], char* envp[])
{
char str[512];
int fd;
if((fd= system_call(SYS_OPEN,STDIN,0, 0777))==-1){
system_call(SYS_WRITE,STDOUT,"stdin error", 11);
}
while((system_call(SYS_READ,fd, str,1))>0){
if((strncmp(";",str,1))==0){
system_call(SYS_WRITE,STDOUT,str, 1);
system_call(SYS_WRITE,STDOUT,"\n", 2);
}
else{
system_call(SYS_WRITE,STDOUT,str, 1);
}
}
return 0;
}
我有一个汇编文件可以将其转换为:“system_call(SYS_WRITE,STDOUT,”\n”, 2);”来写(...);
现在的问题是,我不知道如何让它等待输入,所以它永远不会启动 while 循环,因为它一开始就没有从输入中读取任何内容。
编辑系统调用的代码:
system_call:
push ebp ; Save caller state
mov ebp, esp
sub esp, 4 ; Leave space for local var on stack
pushad ; Save some more caller state
mov eax, [ebp+8] ; Copy function args to registers: leftmost...
mov ebx, [ebp+12] ; Next argument...
mov ecx, [ebp+16] ; Next argument...
mov edx, [ebp+20] ; Next argument...
int 0x80 ; Transfer control to operating system
mov [ebp-4], eax ; Save returned value...
popad ; Restore caller state (registers)
mov eax, [ebp-4] ; place returned value where caller can see it
add esp, 4 ; Restore caller state
pop ebp ; Restore caller state
ret ; Back to caller
已解决
我最终用 STDIN 解决了问题(define 关闭),并且没有定义 fd 来接收值,它最终工作了,不知道为什么仍然如此,我猜测 fd 被设置为非阻塞。
最佳答案
您将 STDIN 定义为 1,而它应该是 0。1 是 STDOUT,因此您尝试从仅用于写入的文件句柄中读取。
关于c - 在 C 中使用 read() 从 stdin 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22684634/