作为一种不同的解决方案,要创建两个相互通信的独立进程,您真正需要担心的是 IPC,而不是真正如何创建这些进程;即像通常那样创建两个进程 A 和 B(system() 或 fork() 或 popen() 等)。
现在,让他们互相交谈的最简单方法是使用NamedPipes。它们是一种方式,因此您必须为 A -> B 创建一个,为 B -> A 创建另一个。它们不需要任何锁定或同步,因为这有点由内核/libc 自己完成。一旦你设置了管道,你就可以像使用简单的网络连接/套接字一样使用它们。
如果您需要'MORE POWER(TM) (C)2010',则必须使用Shared Memory 和Sempahores,或@987654325 @。但是,它们要复杂得多,因此我建议您先研究命名管道。
现在,对于定期运行,最好的方法是在每个程序的主函数中使用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;
}
您实际上并不需要其中的线程,但如果您的程序有不止一件事情,那么这可能是一个好主意,这样一项任务就不会影响关键任务的时间安排。无论如何,由于我已经以这种方式设置了该示例,因此按原样复制粘贴它会更容易。 ;-)
编辑:
现在我读了我的帖子,我注意到一个致命的缺陷:SIGALRM 只能处理 1s 精度,而你需要 ms 精度。在这种情况下,如果您选择此解决方案,则必须使用timer_create(); 非常类似于alarm(),但可以处理毫秒精度。在 linux 中,man 2 timer_create 会给你一个如何使用它的例子。