2010-10-22 30 views
3

我正在創建一個C程序,在特定事件發生時從shell腳本調用。 C程序會從shell腳本參數如下:調用一個程序的同一個實例?

> ./c-program.bin HELLO 

現在的C程序運行,直到它臨危特定的字符作爲參數。問題是,如果發生第二個事件,而C程序現在被稱爲是這樣的:

./c-program.bin WORLD 

然後是開始是一無所知從第一事件串程序的新實例。我想實現的是這樣的:

[EVENT0] ./c-program.bin HELLO 
[EVENT1] ./c-program.bin WORLD 
[EVENT2] ./c-program.bin * 

C-程序輸出:

HELLO WORLD 

如何只有該程序的一個實例任何想法?該平臺是Linux。該項目正處於規劃階段,因此,我目前還沒有任何具體的代碼,我正在嘗試首先解決不同的問題。

回答

1

您也需要一箇中間的應用程序,或者可能是一個單獨的shell腳本

直到你通過一個「*」的中間腳本將緩存參數到磁盤,此時它隨後將整個緩存字符串到最終的c程序。

所以,你的第一個腳本將調用第二個腳本,通過:當第二腳本接收的*參數

secondscript HELLO 
secondscript WORLD 
secondscript * 

通過了所有以前的參數C程序

./c-program.bin HELLO WORLD 

與後面的答案相比,這仍然是迄今爲止最簡單的選擇。你可以在10分鐘內編寫這個腳本。僞代碼中間應用程序/腳本:

passedstring = args[0] 

if passedstring = "*" 
    string cache = readcontents(cachefile) 
    call c program passing cache 
    clearcontents(cachefile) 
else 
    append(cachefile, passedstring) 

然而,如果你想開發一個奇特的跳舞的應用程序,可以檢查內存本身的另一個版本的挑戰,然後通過周圍的東西在插座,去了:)

+0

嗯,這將使C程序更簡單,但我猜中間腳本的多個實例會出現同樣的問題,所以我必須將參數保存在文件中,直到'*'被接收? – sver332 2010-10-22 11:19:49

+0

@ sver332。對不起,我沒有說清楚。將它們緩存到磁盤,然後在收到指示消息已完成的令牌時調用最終的應用程序。 – PaulG 2010-10-22 11:42:48

1

總的來說,你有一個神奇的「輸出所有東西」的參數,並希望在多次調用中累積所有其他參數,直到你獲得請求變得神奇?很簡單,但需要一些共享狀態。首先黑客會將該狀態置於文件系統中(數據庫會更好,但更復雜)。

1

我會使用存儲在某處的pid文件。 如果啓動程序,它應該確定另一個程序沒有運行(使用pid文件+驗證)。如果沒有,請在他要讀取數據的位置創建一個命名管道。然後把它放在後臺,例如感謝子進程(fork)。

然後啓動另一個實例,找到pidfile並檢測實例是否已啓動。第二個程序會將argv [i]發送到命名管道,因此第一個實例應該打印數據。

另一個想法是在給定文件中使用unix套接字,例如mysql.sock。

1

你的程序應該檢查另一個實例是否正在運行,如果是這種情況,則將其參數傳遞給該實例並退出。第一個活着的應該成爲「服務器」,即保持活着,準備好接收數據。您可以使用共享內存或管道在進程之間傳遞數據。

1

你想要的不是很清楚。我認爲你經歷了一個長期運行的過程,積累某種類型的「消息」,然後允許檢索這些消息。

這裏是一個可能的解決方案:

  1. 嘗試在已知位置創建一個FIFO。如果成功,則分叉一個監聽該fifo的守護進程,累積消息,直到它收到一個*,此時它會將所有消息回顯到fifo,包括*
  2. 原始進程(是否產生守護進程)會打開寫入的fifo,並推送消息。
  3. 如果參數是*,它將讀取fifo並輸出它獲得的所有內容,直到它收到回顯的*
相關問題