所以这是我试图运行的代码:
#include<fcntl.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<unistd.h>
int main(){
int ret;
ret = read(STDIN_FILENO,(int*)2000,3);
printf("%d--%s\n",ret,strerror(errno));
return 0;
}
这是我在终端得到的输出
anirudh@anirudh-Aspire-5920:~/Desktop/testing$ gcc test.c
anirudh@anirudh-Aspire-5920:~/Desktop/testing$ ./a.out
lls
-1--Bad address
anirudh@anirudh-Aspire-5920:~/Desktop/testing$ ls
a.out htmlget_ori.c mysocket.cpp Packet Sniffer.c resolutionfinder.c test.c
anirudh@anirudh-Aspire-5920:~/Desktop/testing$
问题 1:当我在读取调用中键入地址 2000 时,地址在read(STDIN_FILENO,(int*)2000,3);
哪里。我认为这是我试图访问的 RAM 的绝对地址。我是对的还是它偏移并被添加到堆栈段基地址。我不知道。该程序没有给我SEGFAULT
内存违规,而是给了我Bad address
问题 2:好的,所以当我输入 aslls
并且 bash 执行该“lls”的“ls”部分时,代码会崩溃。原因是代码在读取第一个“l”后崩溃,其余的“ls”部分由 bash 执行。但是为什么 bash 正在执行左侧的“ls”部分。为什么 bash 这样做是因为我的代码崩溃了,即使 bash 是它的父进程,它也不应该从我编写的代码打开的文件描述符 (STDIN_FILNO) 中读取。( 我认同)...
谢谢你的时间。