2013-06-20 68 views
0

我在C長時間運行的程序在Linux下:如何從一個程序與另一個長時間運行的程序進行通信?

longrun.c

#include <stdio.h> 
int main() 
{ 
    int mode=0; 
    int c=0; 
    while(1) 
    { 
     printf("\nrun @ mode %d value : %d ",mode,c); 
     if (c>100) 
      c=0; 
     if(mode==0) 
      c++; 
     else 
      c=c+2; 
     sleep(3); 
    } 
    return 0; 
} 

它會顯示

run @ mode 0 value : 0 
run @ mode 0 value : 1 
run @ mode 0 value : 2 

我需要用C寫另一個程序(有些東西一樣changemode.c ),以便它可以與longrun.c 進行通信並將其模式值設置爲某個其他值,以便正在運行的程序將以增量順序顯示值 2.

即,如果我一些x分鐘後運行程序,它會在此模式中顯示:

run @ mode 0 value : nnn 
run @ mode 0 value : nnn+2 
run @ mode 0 value : (nnn+2)+2 

我可以用文件的方法做到這一點changemode.c將創建一個文件稱mode = 2 然後longrun.c將每次打開並檢查並繼續。還有其他更好的解決方法,比如進程間通信嗎?

如果可能的話,任何人都可以寫一個changemode.c的樣本?

+0

你有沒有用Google搜索或看着維基百科[進程間通信(http://en.wikipedia.org/wiki/Inter-process_communication)?有很多方法來完成這個。至於socket通信,我用從http://www.linuxhowtos.org/C_C++/socket.htm幾次示例程序。或者,你的文件的建議,堅持,你可以使用[inotify的(http://www.ibm.com/developerworks/linux/library/l-ubuntu-inotify/index.html)得到一點花哨。請記住其中一些操作的阻塞/非阻塞功能。 – Macattack

+0

你真的不需要寫changemod.c可言。只需讓當前的pgm打開(非阻塞)一個FIFO。定期讀取FIFO(或使用'select'來告訴你何時讀取)。另一方面,您可以從命令行寫入FIFO。 – Duck

回答

0

Unix編程中最基本的思想之一就是進程分叉和在兩個進程之間建立管道。 longrun可以通過創建pipe開始,調用fork,並使用父進程作爲changemode「監視」進程,而子進程現在使用longrun。您需要定期讀/寫任何一端。谷歌搜索將返回很多examples。這裏是another

0

正如其他答案中提到的那樣,您需要某種進程間通信。您可以找到「Beej指導的Unix IPC」的主題的更多信息(這是一個「經典」),網址:

http://beej.us/guide/bgipc/

費爾南多

0

該方案分爲兩個部分:

  1. 這兩個進程之間的通信通道。 Unix域套接字是一個很好的工具,它們的行爲與TCP/IP套接字類似。

  2. select代替sleepselect將偵聽套接字,處理與其他程序的通信。你也可以指定一個3秒的超時時間,所以當它返回0(表示在套接字上沒有任何活動)時,你就知道該打印一些輸出了。

作爲#2的替代方案,您可以使用兩個線程 - 一個睡眠和生成輸出,另一個處理套接字。請注意,線程共享的任何數據應該是同步的(在非常簡單的情況下,只有一個整數,您可能不需要任何內容​​,但當它變得更復雜時,您肯定會這樣做)。

相關問題