だからこれは私が実行しようとしているコードです:
#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:さて、入力をasとして指定すると、コードがクラッシュしlls
、bashがその「lls」の「ls」部分を実行します。その理由は、最初の「l」を読み取った後にコードがクラッシュし、残りの「ls」の部分がbashによって実行されるためです。しかし、なぜbashが左側の「ls」部分を実行しているのか。コードがクラッシュし、bashがその親プロセスであったとしても、作成したコードによって開かれたファイル記述子(STDIN_FILNO)から読み取るべきではないため、bashがそうするのはなぜですか。( そう思います)...
御時間ありがとうございます。