2011-07-06 43 views
2

我製作了一個C程序,使圖像脫機並使用fopen/fread/fwrite和libcurl將其保存在文件中。一切編譯完美,我可以通過雙擊該程序完美地運行它。但是,當我嘗試使用任務調度程序來運行它每隔10分鐘在我的電腦上設置的任務,程序打開,當它試圖保存文件出現錯誤:在任務調度程序中運行C程序時出錯

exception::handle: Exception: STATUS_ACCESS_VIOLATION open_stackdumpfile: Dumping stack trace to garden.exe.stackdump

我運行Windows Vista並嘗試使用本機Windows計劃任務功能。我已選中任務屬性中標記爲「以最高權限運行」的框。

+5

程序是違反訪問權限的錯誤。有關此錯誤的信息已轉儲到garden.exe.stackdump。 –

+1

在命令行運行它時,有可能(甚至有可能)在任務計劃程序下有不同的環境。你可能有一些代碼不檢查某個系統調用的返回值,但繼續使用實際上是無效的引用 - 也許是一個空指針 - 這是你所假設的函數的結果'總是成功'。 –

+0

沒有garden.exe.stackdump – jeremy

回答

5

我的猜測是,無論您正在運行的程序是從沒有寫入權限的目錄中執行的。事實上,沒有「garden.exe.stackdump」文件給出了這個線索。

當你將它保存到一個文件中時,你是將它保存爲fopen("myfile","w")還是你使用的是完全限定名?例如,假設你要保存的文件名爲「foobar.png」,並且希望將其保存到你下面指定的目錄,你會碰到這樣的:

char fname[256] = "foobar.png"; 
    char directory[256] = "C:/Users/Joel/Desktop/garden/snaps"; 
    char path[256]; 

    memset(path, 0, sizeof(path)); 
    strcpy(path, directory); 
    strcat(path, "/"); 
    strcat(path, fname); 

    if ((fp = fopen(path, "w")) == NULL) { 
     fprintf(stderr, "Failed to open %s: %s\n", path, strerror(errno)); 
     exit(1); 
    } 

    fwrite(yourdata, yourdata_size, 1, fp); 

因爲你的程序還似乎也將錯誤轉儲到文件中,您可能在程序開始時對chdir("/home/myname")做得很好,以便將任何「.stackdump」文件放置在您有權訪問的位置。

您可能要考慮的另一件事是您的任務計劃程序可能正在運行您的腳本作爲nobody或其他權限剝奪的帳戶。如果是這樣的話,您需要在fopenchdir中使用完整路徑到全局可寫區域(如/tmp)或具有開放權限的工作目錄。例如:

mkdir /home/myname/scratch 
chmod a+rwx /home/myname/scratch 
chmod a+x /home/myname 

(您可以在你的主目錄的執行位,以便允許-less程序可以訪問它的子目錄,即使它不能讀取任何東西。)

+0

我只是使用fopen(「myfile」,「w」)。我選中了「使用最高權限設置運行」任務計劃程序中的複選框。我想寫入/ Users/Joel/Desktop/garden/snaps,這對於任務調度程序來說是不可能的嗎? – jeremy

+0

@Nile - 當然你可以寫在那裏。但是,如果您通過'fopen/fwrite'編寫代碼,則需要爲該位置提供完整路徑。否則,它只是試圖從任務調度器的當前目錄中刪除它。 – unpythonic

+0

@Nile - 它也可能幫助您指定您正在使用的任務調度程序。我假設你在linux上運行。 – unpythonic

相關問題