Welcome 微信登录

首页 / 操作系统 / Linux / Linux下使用C/C++编写一个简单的消息处理程序

// all.h
// wenxy created in 2005/04/12,AM
// All copyright reserved.
#ifndef _ALL_H
#define _ALL_H// ANSC C/C++
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <assert.h>// linux
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include<fcntl.h>// micro define
//#define OutErrStr(info) (printf("Error : %s ", info))//#define OutErrInt(info) (printf("Error : %d ", info))
#define BUFF_SIZE 1024 * 1
#endif// ----------------------------------------------------------------------------------// main.c#include "all.h"// function
static int ChildProcessFun(void *pParam);// struct
struct _PROCESS_PARAM
{
 #define STR_1 "This is date on pipe."
 #define DADA_LEN sizeof(STR_1)
 char chBuff[BUFF_SIZE];
 int nPipe[2];
 pid_t nProcess;
};
int main()
{
 printf("Run ... ");
  struct _PROCESS_PARAM ProcessParam; int nFlag = pipe(ProcessParam.nPipe);
 if (nFlag == -1)
 {
  printf("Error: crrete pipe failed! ");
  printf("------------------------------ ");
 }
 assert(ProcessParam.nPipe[0]);
 assert(ProcessParam.nPipe[1]);
 
 // create a child press
 ProcessParam.nProcess = fork();
 if (ProcessParam.nProcess < 0) /* create process failed */
 {
  printf("Error: create child process failed! ");
  printf("------------------------------ ");
 }
 else if (ProcessParam.nProcess > 0) /* parent process */
 {
  printf(" Note:  in parent process ... ");
  printf("New child process ID = %d ", ProcessParam.nProcess);
 
  // write pipe
  close(ProcessParam.nPipe[0]);
  write(ProcessParam.nPipe[1],  STR_1, strlen(STR_1));
 }
 else /* child process */
 {
  if(ChildProcessFun(&ProcessParam) == 0)
  {
   printf("Child process exit ... ");
  }
  else
  {
   printf("Error: Child process dead lock ... ");
   printf("------------------------------ ");
  }
 } 
 // close pipe
 close(ProcessParam.nPipe[0]);
 close(ProcessParam.nPipe[1]);
 printf("parent process exit ... ");
 return 0;
}
// child process funtion
static int ChildProcessFun(void *pParam)
{
 struct _PROCESS_PARAM ProcessParam =
          (struct _PROCESS_PARAM)
          *(struct _PROCESS_PARAM *)pParam; printf("Note: in child process ... ");
 printf("The child process ID = %d ", ProcessParam.nProcess);
 
 // read pipe
 close(ProcessParam.nPipe[1]);
 read(ProcessParam.nPipe[0], ProcessParam.chBuff, DADA_LEN);
 ProcessParam.chBuff[DADA_LEN] = ""; /* good action */
 printf("Read the pipe data: %s ", ProcessParam.chBuff);
 printf("********************************* ");
 return 0; 
}
/* end main.c ******************************************************* */// -----------------------------------------------------------------------------------------------# makefileobjets = main.o
rubbish = $(objets) main
main : main.o
 g++ -o main main.omain.o : main.c all.h
 g++ -c main.c
.PHONY : clean
clean :
 -rm $(rubbish)
 
# end makefile