Вот код, который я пытаюсь запустить:
#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 read(STDIN_FILENO,(int*)2000,3);
тогда где находится адрес. Я думаю, что это абсолютный адрес ОЗУ, к которому я пытаюсь получить доступ. Я прав или это смещение и добавляется к базовому адресу сегмента стека. Я не знаю. Программа не дает мне SEGFAULT
за нарушение памяти, а дает мне Bad address
Вопрос 2: Хорошо, код вылетает, когда я передаю ввод как lls
, и bash выполняет часть "ls" этого "lls". Причина в том, что код вылетает после чтения первой буквы «l», а остальная часть «ls» выполняется bash. но почему bash выполняет левую часть "ls". Почему bash делает это, потому что мой код не работает, и даже если bash был его родительским процессом, он не должен читать из дескриптора файла (STDIN_FILNO), открытого кодом, который я написал. (Я так думаю) ...
Спасибо за ваше время.