2011-11-03 76 views
2

我將如何在Linux中使用C來做到這一點? 我需要編寫更新函數,使用wget下載更新,然後用更新替換舊文件,然後啓動更新文件。 一個想法是使用bash腳本,但沒有成功。 有什麼建議嗎?Linux覆蓋正在運行的二進制文件

編輯:這裏是代碼類同什麼我想

char *p_name = "example"; /* name of the running executable */ 

void update(char *update_url) 
{ 
     if(!fork()) 
       /* download file to temporary location */ 
       execlp("wget", "wget" "-q", update_url, "-O", "tmp", NULL); 
     wait(NULL); 
     FILE *fp = fopen("tmp.sh", "w"); 
     /* write bash script */ 
     fprintf(fp, "sleep 5\nmv tmp %s\nchmod +x %s\nrm tmp.sh", 
       p_name, p_name); 
     fclose(fp); 
     execlp("bash", "bash", "tmp.sh", NULL); 
} 
+3

你想要做什麼應該原則上如你所描述的那樣工作。請提供更多關於錯誤發生的信息(理想的實際代碼和錯誤信息)。 – sleske

+0

如果它正在內存中運行加載,真正的問題是如何從正在運行的進程切換到包含更新代碼的新進程。 – Muggen

+0

你嘗試了什麼?你是怎麼失敗的? Linux允許替換打開的文件和運行二進制文件。我猜你有過permssion問題(由root擁有二進制文件,更新爲普通用戶運行或更新) – johannes

回答

6

覆蓋一個正在運行的程序實際上不會覆蓋文件,它基本上創建一個新的文件,同時標誌着舊文件被刪除時,程序退出。

腳本下載新程序後,您必須登錄正在運行的程序kill,然後重新啓動它。它將從新程序開始。

+0

實際上,你不需要殺死該程序,只需「執行」即可。 – JeremyP

+9

這實際上是錯誤的。覆蓋文件和替換文件是有區別的。通過使用'rename'或'mv' shell命令來替換庫是安全的。它是**不安全**打開文件進行寫入並替換內容。 –

相關問題