|
最近在研究一些功能,父进程需要通知子进程一些消息。
于是写了一个例子,借助本地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[CHILDREN_COUNT][2];
-
- for(int i = 0; i < CHILDREN_COUNT; i++)
- {
- printf("[main]i=%d.\n", i);
-
- socketpair(AF_UNIX, SOCK_STREAM, 0, ayfd[i]);
-
- pid = fork();
- if(pid == 0)
- {
- //子进程
- printf("[Child]child process run(%d).\n", i);
- char szData[50] = {'\0'};
- while(true)
- {
- //printf("[Child]child recv begin.\n");
- int nLen = read(ayfd[i][0], szData, sizeof(szData));
- if(nLen > 0)
- {
- printf("[Child]Recv Data[child %d](%s).\n", i, szData);
- printf("[child]nTest=%d.\n", nTest);
- close(ayfd[i][1]); //关闭写
- }
- else
- {
- //ACE_Time_Value tvSleep(0, 10000);
- //ACE_OS::sleep(tvSleep);
- usleep(10000);
- }
- }
- }
- }
-
- printf("[Father]pid=%d.\n", pid);
- //父进程
- printf("[Father]Father process run.\n");
- char szData[50] = {'\0'};
- sprintf(szData, "Hello child.");
-
- //关闭所有读
- for(int j = 0; j < CHILDREN_COUNT; j++)
- {
- close(ayfd[j][0]);
- }
- while(true)
- {
- printf("[Father]Send Begin.\n");
- for(int j = 0; j < CHILDREN_COUNT; j++)
- {
- int nLen = write(ayfd[j][1], szData, sizeof(szData));
- printf("[Father]Send Data(%d).\n", nLen);
- }
-
- nTest++;
- /*
- ACE_Time_Value tvSleep(10, 0);
- ACE_OS::sleep(tvSleep);
- */
- sleep(10);
- }
- //close(filedes[1]);
- #endif
- return 0;
- }
复制代码 这部分代码只支持Linux,不考虑windows。
|
|