基於Linux系統調用使用php實現一個在線編譯運行C語言程序的系統

     前段時間給學校做一個在線練習C語言程序和C語言考試的系統,服務器架構是LAMP的。因爲其他的都沒什麼好多的,要實現在線編譯只要exec()函數直接調用gcc進行編譯就行了,

    這裏解釋一下命令:$filename是你的C語言源程序的地址,-o指定生成可執行文件名,2>compile_result.txt是將編譯結果輸出到compile_result.txt文件裏面去(gcc的編譯結果是輸出到標準錯誤2的而不是標準輸出1)分號是本語句結束,下一個語句是編碼轉換的命令,因爲我要返回的是gb2312編碼的字符,所以就將之前的編譯結果文件轉換成GB2312編碼放到compile_res.txt裏面去了。這裏實現其實很多餘,因爲你完全可以就enconv -L zh_CN -x UTF-8 filename直接搞定,但是蛋疼的是服務器居然沒有這個工具。沒辦法之下才用的iconv。如果客戶要的就是UTF-8編碼的話,那直接 2>&1就OK了,都不用臨時文件咯~

    接下來是要在客戶端上運行我們的C程序,並且將程序的輸出輸出到瀏覽器上。(並且能夠讀入用戶端在瀏覽器輸入的輸入)這纔是我們的重頭戲!
首先,我們的實現還是基於臨時文件和系統調用的基礎之上實現的。不錯如果要把用戶的輸入給弄到程序裏面去的話,僅僅這樣是不行的,下面我來說下我的實現方法:

主要的代碼就是這樣,這裏的run_me程序是一個用C語言寫的,將用戶程序作爲一個子進程運行,並且將用戶程序的標準輸入關閉,通過管道把input.txt的內容輸入到用戶程序中。(這裏需要寫過Linux下的進程最後輸出運行結果的操作。
run_me的源代碼如下:

 

如果熟悉在Linux下操作的朋友門一定覺得我上面的操作有點多餘,直接就運行./prog_name < input.txt不就完了麼?呵呵,是這樣的,但是你要想到,如果用戶是一個死循環程序,那麼,你的服務器估計活不了太長的時間,如果只在系統層面limit對系統做限制,又不能保證大量用戶同時使用這個系統。所以我才自己手動實現了一個重定向操作,並且加入了只讓用戶程序執行10毫秒的元素,這樣就解決問題了~呵呵,如果有更好的方法希望大家推薦一下。也歡迎大家指出我的錯誤和問題。有什麼不明白的地方也可以說出來大家討論討論~~

發佈了39 篇原創文章 · 獲贊 50 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章