我正在Linux下使用C++進行實時編程。如何在Linux下用C++實現兩個定期進程?
我有兩個過程,讓我說A和B.一個過程正在週期性地開始,每隔5ms。 B過程每10ms啓動一次。過程A正在做一些數據更改。過程B正在讀取該數據並顯示它。
我對如何定期運行進程感到困惑,我應該爲每個進程有兩個.cpp程序嗎?
我正在Linux下使用C++進行實時編程。如何在Linux下用C++實現兩個定期進程?
我有兩個過程,讓我說A和B.一個過程正在週期性地開始,每隔5ms。 B過程每10ms啓動一次。過程A正在做一些數據更改。過程B正在讀取該數據並顯示它。
我對如何定期運行進程感到困惑,我應該爲每個進程有兩個.cpp程序嗎?
我認爲,如果可能的話,創建一個具有兩個線程的進程也可能是一個很好的解決方案,因爲它們可能更容易共享資源並同步數據。但是,如果您需要的不僅僅是這些,那麼我認爲在陳述您的問題時您需要更清楚一些。
作爲一種不同的解決方案,爲了創建兩個彼此通信的獨立進程,您真正必須擔心的是IPC,而不是真的如何創建這些進程;即像通常那樣創建兩個過程A和B(system()
或fork()
或popen()
等)。
現在,讓他們互相交談的最簡單方法是使用NamedPipes。它們是一種方式,所以你必須爲A - > B創建一個,而爲B - > A創建另一個。它們不需要任何鎖定或同步,因爲這是由kernel/libc自己完成的。你建立了管道,你可以像使用簡單的網絡連接/套接字一樣使用它們。
如果你需要 '更多的權力(TM)(C)2010',那麼你就必須使用Shared Memory和Sempahores,或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
會給你一個關於如何使用它的例子。
當您詢問作業時,請使用作業標籤。那麼答案就不太可能提出替代方法來做不符合你任務要求的方法(例如線程而不是多個進程)。 – 2010-07-26 13:35:38
好的。我會。我不知道那件事。 – MarijaS 2010-07-26 15:14:19