簡體   English   中英

如何從一個程序與另一個長期運行的程序進行通信?

[英]How to communicate from one program to another long running program?

我在Linux下的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類的changemode.c ),以便它可以與longrun.c通信並將其mode的值設置為其他值,以便正在運行的程序將按以下順序遞增顯示值: 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的樣本嗎?

Unix編程中最基本的思想之一是進程派生,以及在兩個進程之間建立管道。 longrun可以通過創建一個啟動 ,叫 ,並使用父進程的changemode “監視”的過程,孩子的過程,你使用longrun現在。 您將需要定期在任一端進行讀取/寫入。

Google搜索將返回許多示例 這是另一個

如其他答案所述,您需要某種進程間通信。 您可以在“ Beej Unix IPC指南”(這是“經典”)中找到有關該主題的更多信息,可在以下位置找到:

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

費爾南多

該解決方案包括兩個部分:

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

  2. select代替sleep select將偵聽套接字,處理與其他程序的通信。 您還可以指定3秒鍾的超時,因此當它返回0(意味着套接字上沒有活動)時,您就知道該打印一些輸出了。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM