很久沒更新博客了,今天是扒衣見君節,可貴閒下來就來講說一個最近有趣的發現吧.函數
首先廢話很少說,直接上代碼吧測試
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 var bytes = new byte[4096]; 6 for (int i = 0; i < bytes.Length; i++) 7 { 8 bytes[i] = 7; 9 } 10 11 Console.WriteLine(Encoding.ASCII.GetString(bytes)); 12 string line = Console.ReadLine();//你已經死了 這部分是沒有機會跑到了............ 13 while (line != "ok") 14 { 15 Console.WriteLine(line); 16 line = Console.ReadLine(); 17 } 18 } 19 }
有興趣的童鞋能夠建個控制檯程序跑一下,看看會不會程序失去響應.看回復中的信息,貌似WIN8.1和WIN10都沒這個問題.我這邊是在WIN7SP1下測試會失去響應的.若是還有用老掉牙XP的能夠測試一下結果發上來看看.spa
爲何會掛掉呢?code
關鍵就在於這個ASCII代碼7,請看下圖的ASCII碼錶.blog
ASCII的7表明BELL,也就是讓主板上的蜂鳴器叫一聲,就和你電腦剛剛開機時候的滴一聲同樣.因此輸出ASCII的7就會讓主板蜂鳴器叫一聲,不過如今都是WINDOWS接管了,不是當年DOS年代了,蜂鳴器這部分由beep.sys這個驅動文件接管了,WIN7下的beep.sys會從聲卡發聲,XP下的beep.sys仍是老樣子走主板蜂鳴器的.題外話,當初機器狗病毒也會修改這個beep.sys,畢竟權限是ring0的,拿最高權限和殺毒軟件幹才是硬道理……
因此咱們用Console.WriteLine輸出ASCII代碼7的時候,等因而調用了系統函數去發聲,而不單單是在控制檯上打印文本.當咱們輸出大量的ASCII代碼7的時候,就會不斷的去調用這個系統函數,你會發現進程中有個負責DComLaunch的svchost進程基本上進入死循環狀態,而你的控制檯程序,在系統函數調用結束以前是不會再有響應了……進程
這玩意能幹什麼呢?
說了這麼多,那麼這個問題有什麼利用價值呢?其實利用價值仍是挺大的,不少作服務類程序的人很喜歡直接上手開一個控制檯程序,還喜歡把異常信息之類的打印在控制檯上,若是你直接顯示了用戶的輸入,那麼我只要發一堆ASCII代碼7過來,你的服務基本上就掛了……
雖然我只是在C#裏面作了測試,可是不表示其餘的語言就沒有影響了,畢竟都是作成WINDOWS控制檯程序的,有對應其餘語言環境的能夠試試看.博客