2012-02-10 94 views
1

我們可以強制退出一個C程序的執行幾秒鐘後(毫秒範圍內)或由它使用的內存大小嗎?這樣,我想限制打印內容的無限循環並限制緩衝區溢出。我們可以在幾秒鐘後強制退出C程序的執行

我正在使用cygwin GCC4.3編譯器,並希望將它作爲PHP中的一個工具來實現,它將C源代碼作爲輸入並顯示相應的輸出。

PS - 1.我說毫秒,因爲我的C問題只涉及非常簡單的算術/計算。 2.要限制執行時間,php中的set_time_limit()將限制整個PHP腳本的執行時間,而不是分配給exec的時間()

+2

使用一個定時器,然後在計時器到期時只是'退出()'或'退出()'程序。 – 2012-02-10 06:40:05

+1

您不會以這種方式防止緩衝區溢出。爲了真正限制緩衝區溢出 - 你應該用'-fstack-protector-all'標誌來編譯C源代碼。 – 2012-02-10 06:45:09

+0

@Als我不能在C程序中使用定時器我必須在編譯時或通過PHP腳本處理它 – 2012-02-10 06:46:31

回答

1

您應該能夠使用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--並粘貼到您的主體中;

更新2

以限制內存嘗試使用了setrlimit:

看到Set stack size with setrlimit() and provoke a stack overflow/segfault

爲例

+1

除了'alarm()'的工作單位數千毫秒(又名'秒')... – 2012-02-10 06:51:12

+0

@Ahmed MAsud運行無限循環gcc使.exe文件以秒爲單位。但是當我嘗試讀取它永久運行的.exe文件時會出現問題。 – 2012-02-10 06:56:45

+0

@JonathanLeffler感謝您指出了jonathan,修復了 – 2012-02-10 07:00:04

2

您可能要調查您的系統是否有nanosleep()自2008年POSIX注意即使您可以指定納秒級時間,系統也可能無法非常可靠地承認亞毫秒級時序。

您可能會發現µ-sleep()(拼寫爲usleep())可用,但它已正式過時。它指定一個包括微秒的時間。在Google上搜索'usleep窗口'的快速搜索建議將Sleep()作爲本地Windows備選項。另見:Sleep less than one millisecond

另見:Sleep less than one millisecond。還有:。目前沒有編寫該程序來處理亞秒時序,但一旦您決定使用亞秒時序界面,必要的改編就不會很難了。

0

我在過去做過類似的事情,我用的架構是 - 有一個父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 - 這是測試文件。

這增加了一層讓你編譯和調試,但它的作品。

+0

確定它創建一個子線程,但仍然問題沒有解決無限循環和更多的內存消耗,我不想在代碼中進行更改。我想限制它在編譯時或由PHP – 2012-02-10 07:15:36

0

限制內存大小隻是不使用動態內存分配或遞歸。然後您可以確保內存需求是有界的(即安全關鍵系統的編碼標準)。

至於時間要求,爲什麼只能忍受秒數的限制並將執行時間限制到一秒?

+0

實際上我想在編譯時檢查所有這些東西,程序可以包含任何東西,我不想限制它。 – 2012-02-10 07:41:40

+0

您無法在編譯時限制執行時間。這是不可能的,因爲在執行程序時,執行時間取決於處理器/磁​​盤/內存還在做什麼。但是,如上所述,您可以對內存要求設置一個上限。 – 2012-02-10 08:21:31

+0

你能告訴我如何設置一個C progarm的內存上限 – 2012-02-10 09:14:57

相關問題