freeeyes 发表于 2014-10-22 13:36:44

父进程群发消息给子进程的方法

最近在研究一些功能,父进程需要通知子进程一些消息。
于是写了一个例子,借助本地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]
查看完整版本: 父进程群发消息给子进程的方法