【发布时间】:2011-06-18 01:05:54
【问题描述】:
这就是我要运行的代码:
#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: 当我在读取调用 read(STDIN_FILENO,(int*)2000,3); 中键入地址 2000 时
那么地址在哪里。我认为这是我试图访问的 RAM 的绝对地址。我是对的还是它偏移并被添加到堆栈段基地址。我不知道。该程序没有给我SEGFAULT 内存违规,而是给我Bad address
问题 2: 好的,所以当我输入 lls 并且 bash 执行该“lls”的“ls”部分时,代码会崩溃。原因是代码在读取第一个“l”后崩溃,其余的“ls”部分由 bash 执行。但是为什么 bash 正在执行左侧的“ls”部分。为什么 bash 这样做是因为我的代码崩溃了,即使 bash 是它的父进程,它也不应该从我编写的代码打开的文件描述符 (STDIN_FILNO) 中读取。 (我想是的)...
感谢您的宝贵时间。
【问题讨论】:
-
"我认为这是我尝试访问的 RAM 的绝对地址。"你这么认为,基于什么信息?
-
@Anirudh:真的没有比指定固定内存位置更好的方法了吗?您能否提供一些有关您想要实现的目标的背景信息?
-
为什么不正常使用
read(),即unsigned char buffer[3]; read(STDIN_FILENO, &buffer, sizeof(buffer));???
标签: c offset segment memory-address