父进程群发消息给子进程的方法
最近在研究一些功能,父进程需要通知子进程一些消息。于是写了一个例子,借助本地socketpair。
于是实现了一个例子,测试通过。
感觉这个目前还有缺陷,当管道破裂的时候如何重建?还需要自己想想。
// ACETimer.cpp : 定义控制台应用程序的入口点。
//
/*
#include "ace/ACE.h"
#include "ace/SString.h"
#include "ace/Malloc.h"
#include "ace/Malloc_T.h"
#include "ace/Task_T.h"
#include "ace/Local_Memory_Pool.h"
#include "ace/Time_Value.h"
#include "ace/OS_main.h"
#include "ace/OS_NS_sys_stat.h"
#include "ace/OS_NS_sys_socket.h"
#include "ace/OS_NS_unistd.h"
#include "ace/High_Res_Timer.h"
#include "ace/INET_Addr.h"
*/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
using namespace std;
//子线程个数
#define CHILDREN_COUNT 2
int main(int argc, char *argv[])
{
#ifndef WIN32
int nTest = 1;
pid_t pid = 0;
//pipe(filedes);
//子进程和父进程的fd通讯信息
int ayfd;
for(int i = 0; i < CHILDREN_COUNT; i++)
{
printf("i=%d.\n", i);
socketpair(AF_UNIX, SOCK_STREAM, 0, ayfd);
pid = fork();
if(pid == 0)
{
//子进程
printf("child process run(%d).\n", i);
char szData = {'\0'};
while(true)
{
//printf("child recv begin.\n");
int nLen = read(ayfd, szData, sizeof(szData));
if(nLen > 0)
{
printf("Recv Data(%s).\n", i, szData);
printf("nTest=%d.\n", nTest);
close(ayfd); //关闭写
}
else
{
//ACE_Time_Value tvSleep(0, 10000);
//ACE_OS::sleep(tvSleep);
usleep(10000);
}
}
}
}
printf("pid=%d.\n", pid);
//父进程
printf("Father process run.\n");
char szData = {'\0'};
sprintf(szData, "Hello child.");
//关闭所有读
for(int j = 0; j < CHILDREN_COUNT; j++)
{
close(ayfd);
}
while(true)
{
printf("Send Begin.\n");
for(int j = 0; j < CHILDREN_COUNT; j++)
{
int nLen = write(ayfd, szData, sizeof(szData));
printf("Send Data(%d).\n", nLen);
}
nTest++;
/*
ACE_Time_Value tvSleep(10, 0);
ACE_OS::sleep(tvSleep);
*/
sleep(10);
}
//close(filedes);
#endif
return 0;
}
这部分代码只支持Linux,不考虑windows。
页:
[1]