2010-07-23 21 views
2

我正在Linux下使用C++進行實時編程。如何在Linux下用C++實現兩個定期進程?

我有兩個過程,讓我說A和B.一個過程正在週期性地開始,每隔5ms。 B過程每10ms啓動一次。過程A正在做一些數據更改。過程B正在讀取該數據並顯示它。

我對如何定期運行進程感到困惑,我應該爲每個進程有兩個.cpp程序嗎?

+0

當您詢問作業時,請使用作業標籤。那麼答案就不太可能提出替代方法來做不符合你任務要求的方法(例如線程而不是多個進程)。 – 2010-07-26 13:35:38

+0

好的。我會。我不知道那件事。 – MarijaS 2010-07-26 15:14:19

回答

1

我認爲,如果可能的話,創建一個具有兩個線程的進程也可能是一個很好的解決方案,因爲它們可能更容易共享資源並同步數據。但是,如果您需要的不僅僅是這些,那麼我認爲在陳述您的問題時您需要更清楚一些。

+0

問題是我必須使用進程和IPC ...這是任務:( – MarijaS 2010-07-23 16:17:52

+0

@MarijaS然後,一個包含多個線程的進程是最簡單的解決方案,您可以創建全局數據結構並使用pthreads的互斥鎖保護它們 – Gianni 2010-07-23 16:26:08

+0

如果我真的需要使用進程A和進程B,那麼該怎麼辦?是創建子進程的唯一方法嗎?或者我可以用其他方式創建獨立進程? Tnx! – MarijaS 2010-07-26 09:51:50

1

作爲一種不同的解決方案,爲了創建兩個彼此通信的獨立進程,您真正必須擔心的是IPC,而不是真的如何創建這些進程;即像通常那樣創建兩個過程A和B(system()fork()popen()等)。

現在,讓他們互相交談的最簡單方法是使用NamedPipes。它們是一種方式,所以你必須爲A - > B創建一個,而爲B - > A創建另一個。它們不需要任何鎖定或同步,因爲這是由kernel/libc自己完成的。你建立了管道,你可以像使用簡單的網絡連接/套接字一樣使用它們。

如果你需要 '更多的權力(TM)(C)2010',那麼你就必須使用Shared MemorySempahores,或Message queues。但是,它們要複雜得多,所以我建議你先看看命名管道。

現在,對於定期運行,最好的方法是在每個程序的主要功能中使用usleep(T);你可以從上次運行時間計算出你使用的時間T,而不是在那裏放置一個固定的時間,這樣你就可以保證運行時間比預期的要長,你會睡得更少,以保證每個X毫秒您的程序運行。

做的另一種方法,是使用SIGALRM這樣的:

#include <iostream> 
#include <string.h> 
#include <errno.h> 

#include <unistd.h> 
#include <signal.h> 

#include <pthread.h> 
#include <semaphore.h> 

static sem_t __semAlaram; 

static void* waitForAlaram(void*) 
{ 
    while(true) 
    { 
     sem_wait(&__semAlaram); 
     std::cout << "Got alaram" << std::endl; 
    } 
    return NULL; 
} 


typedef void (*sighandler_t)(int); 
static sighandler_t __handler = NULL; 
static int count = 0; 

static void sighandler(int signal) 
{ 
    if (signal == SIGALRM) 
    { 
     count++; 
     sem_post(&__semAlaram); 
     alarm(3); 
    } 
    else if (__handler) 
     __handler(signal); 
} 

int main(int argc, char **argv) 
{ 
    if (sem_init(&__semAlaram, 0, 0) != 0) 
    { 
     std::cerr << strerror(errno) << std::endl; 
     return -1; 
    } 

    pthread_t thread; 
    if (pthread_create(&thread, NULL, waitForAlaram, NULL) != 0) 
    { 
     std::cerr << strerror(errno) << std::endl; 
     return -1; 
    } 

    __handler = signal(SIGALRM, sighandler); 
    alarm(3); 

    while(count < 5) 
    { 
     sleep(1); 
    } 
    return 0; 
} 

你並不真的需要在那裏線程,但它可能是,如果你有超過1個東西你的程序是個好主意確實如此,因此一項任務不會影響到關鍵任務的執行時間。無論如何,因爲我已經以這種方式設置了這個例子,所以將它複製粘貼就更容易了。 ;-)

編輯: 現在,我閱讀我的文章,我注意到一個致命的缺陷:SIGALRM只能處理1秒的精度,而你需要毫秒精度。在這種情況下,如果您選擇此解決方案,則必須使用timer_create();這與很相似類似於alarm(),但可以處理ms精度。在linux中,man 2 timer_create會給你一個關於如何使用它的例子。

+0

+1:對於「更多能力」(I會盡量利用它)) – rubenvb 2010-07-26 13:10:36

+0

謝謝! 我會嘗試首先處理命名管道。 定期跑步的建議? – MarijaS 2010-07-26 13:24:14

+1

@rubenv對不起,我的錯。固定。 :) – Gianni 2010-07-26 13:24:21

相關問題