我們可以強制退出一個C程序的執行幾秒鐘後(毫秒範圍內)或由它使用的內存大小嗎?這樣,我想限制打印內容的無限循環並限制緩衝區溢出。我們可以在幾秒鐘後強制退出C程序的執行
我正在使用cygwin GCC4.3編譯器,並希望將它作爲PHP中的一個工具來實現,它將C源代碼作爲輸入並顯示相應的輸出。
PS - 1.我說毫秒,因爲我的C問題只涉及非常簡單的算術/計算。 2.要限制執行時間,php中的set_time_limit()將限制整個PHP腳本的執行時間,而不是分配給exec的時間()
我們可以強制退出一個C程序的執行幾秒鐘後(毫秒範圍內)或由它使用的內存大小嗎?這樣,我想限制打印內容的無限循環並限制緩衝區溢出。我們可以在幾秒鐘後強制退出C程序的執行
我正在使用cygwin GCC4.3編譯器,並希望將它作爲PHP中的一個工具來實現,它將C源代碼作爲輸入並顯示相應的輸出。
PS - 1.我說毫秒,因爲我的C問題只涉及非常簡單的算術/計算。 2.要限制執行時間,php中的set_time_limit()將限制整個PHP腳本的執行時間,而不是分配給exec的時間()
您應該能夠使用alarm()函數。雖然它在unistd.h中找到,但它是一個POSIX.1-2001函數,應該在cygwin下可用。如果不處理SIGALRM,則會終止進程。
試試:
#include <stdio.h>
#include <unistd.h>
int main() {
alarm(5); /* raise alarm after 5 seconds */
while(1) {
printf("Running forever\n");
}
return 0; /* never reached */
}
喬納森指出報警(2)只能在幾秒鐘內,因此您可以setitimer而不是(也POSIX兼容)
#include <stdio.h>
#include <sys/time.h>
int main() {
/* --CUT HERE-- */
struct itimerval timer;
timer.it_value.tv_sec = 0;
timer.it_value.tv_usec = 5000; /* 5 milliseconds */
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = 0;
setitimer(ITIMER_REAL, &timer, NULL);
/* --END CUT-- */
while(1) {
printf("Running forever\n");
}
return 0; /* never reached */
}
如果使用上述作品在您的系統上, 將代碼從--CUT HERE--複製到--END CUT--並粘貼到您的主體中;
以限制內存嘗試使用了setrlimit:
看到Set stack size with setrlimit() and provoke a stack overflow/segfault
爲例
除了'alarm()'的工作單位數千毫秒(又名'秒')... – 2012-02-10 06:51:12
@Ahmed MAsud運行無限循環gcc使.exe文件以秒爲單位。但是當我嘗試讀取它永久運行的.exe文件時會出現問題。 – 2012-02-10 06:56:45
@JonathanLeffler感謝您指出了jonathan,修復了 – 2012-02-10 07:00:04
您可能要調查您的系統是否有nanosleep()
自2008年POSIX注意即使您可以指定納秒級時間,系統也可能無法非常可靠地承認亞毫秒級時序。
您可能會發現µ-sleep()
(拼寫爲usleep()
)可用,但它已正式過時。它指定一個包括微秒的時間。在Google上搜索'usleep窗口'的快速搜索建議將Sleep()
作爲本地Windows備選項。另見:Sleep less than one millisecond。
另見:Sleep less than one millisecond。還有:。目前沒有編寫該程序來處理亞秒時序,但一旦您決定使用亞秒時序界面,必要的改編就不會很難了。
我在過去做過類似的事情,我用的架構是 - 有一個父C程序說main.c,類似於下面的代碼(注意這不是一個生產代碼的方法,甚至不保證編譯,下面的代碼僅用於演示目的)。
// ---------------------- main.c ----------------
int main_child(); // the body is defined in "your_test_source.c"
int main()
{
pthread_t tid;
// create child thread
pthread_create(tid, NULL, main_child, NULL);
// start monitoring the child thread
// ...
// you can kill child thread by calling pthread_exit
// and check for memory usage by system calls.
return 0;
}
#define main main_child
// we change the main function to main_child
#include "your_test_source.c"
#undef main
// ---------------------- end -------------
your_test_source.c - 這是測試文件。
這增加了一層讓你編譯和調試,但它的作品。
確定它創建一個子線程,但仍然問題沒有解決無限循環和更多的內存消耗,我不想在代碼中進行更改。我想限制它在編譯時或由PHP – 2012-02-10 07:15:36
限制內存大小隻是不使用動態內存分配或遞歸。然後您可以確保內存需求是有界的(即安全關鍵系統的編碼標準)。
至於時間要求,爲什麼只能忍受秒數的限制並將執行時間限制到一秒?
實際上我想在編譯時檢查所有這些東西,程序可以包含任何東西,我不想限制它。 – 2012-02-10 07:41:40
您無法在編譯時限制執行時間。這是不可能的,因爲在執行程序時,執行時間取決於處理器/磁盤/內存還在做什麼。但是,如上所述,您可以對內存要求設置一個上限。 – 2012-02-10 08:21:31
你能告訴我如何設置一個C progarm的內存上限 – 2012-02-10 09:14:57
使用一個定時器,然後在計時器到期時只是'退出()'或'退出()'程序。 – 2012-02-10 06:40:05
您不會以這種方式防止緩衝區溢出。爲了真正限制緩衝區溢出 - 你應該用'-fstack-protector-all'標誌來編譯C源代碼。 – 2012-02-10 06:45:09
@Als我不能在C程序中使用定時器我必須在編譯時或通過PHP腳本處理它 – 2012-02-10 06:46:31