23,124
社区成员
发帖
与我相关
我的任务
分享
// 父进程
while(1)
{
int iConnectFlag[10]; // 子进程的状态,0:未启动,1:启动并工作正常
pid_t pid[10];
char buffer[20];
memset( iConnectFlag,0,10*sizeof(int));
for( int i=0; i < 10; i++)
{
if( iConnectFlag[i] == 0 )
{
pid[i] = fork();
if(pid[iChannelIdx] < 0) // error, return
{
printf("fork error\n ");
}
else if (pid[i] == 0) // the child process
{
int re = connectserver(); // 连接服务器,
if(re==0)//连接成功
{
int pipe_fd;
int open_mode = O_WRONLY;
pipe_fd = open(FIFO_NAME,open_mode);
if(pipe_fd != -1)
{
sprintf(buffer,"%.2xstart", i);
int res=write(pipe_fd,Buffer,BUFFER_SIZE);
if(res==-1)
{
fprintf(stderr,"write error on pipe\n");
exit(0);
}
else
{
printf("write ok,buffer=%s\n",pchBuffer);
}
}
close(pipe_fd);
work();// 里面有while循环,一直工作,直到和服务器断开连接
sprintf(buffer,"%.2xstop!", i);
WriteToPipe( buffer);
sleep(3);
exit(0); // 子进程退出
}
else
{
int pipe_fd;
int open_mode = O_WRONLY;
pipe_fd = open(FIFO_NAME,open_mode);
if(pipe_fd != -1)
{
sprintf(buffer,"%.2xstop", i);
int res=write(pipe_fd,Buffer,BUFFER_SIZE);
if(res==-1)
{
fprintf(stderr,"write error on pipe\n");
exit(0);
}
else
{
printf("write ok,buffer=%s\n",pchBuffer);
}
}
close(pipe_fd);
sleep(3);
exit(0); // 子进程退出
}
}
else // in parent
{
}
}
else
{
int pipe_fd;
int open_mode = O_WRONLY;
pipe_fd = open(FIFO_NAME,open_mode);
if(pipe_fd != -1)
{
sprintf(buffer,"%.2xtest", i);
int res=write(pipe_fd,Buffer,BUFFER_SIZE);
if(res==-1)
{
fprintf(stderr,"write error on pipe\n");
exit(0);
}
else
{
printf("write ok,buffer=%s\n",pchBuffer);
}
}
close(pipe_fd);
sleep(1);
}
sleep(1);
int pipe_fd;
int open_mode = O_RDONLY;
char buffer[BUFFER_SIZE+1];
if(access(FIFO_NAME,0777)==-1)
{
pipe_fd = open(FIFO_NAME,open_mode);
if(pipe_fd != -1)
{
res=read(pipe_fd,buffer,BUFFER_SIZE);
if(res==-1)
{
fprintf(stderr,"read error on pipe\n");
}
else
{
printf("read ok,buffer=%s\n",buffer);
string strCommand;
char chCommand[20];
int iChannelNum;
// 解析FIFO字符串内容
ParsePipeContent(buffer, iNum, chCommand );
strCommand.insert(0,chCommand);
if(strCommand=="start") // this channel has been started.
{
iConnectFlag[iNum] =1;
}
else if(strCommand=="stop!") // this channel has been stoped.
{
iConnectFlag[iNum] = 0;
}
}
close(pipe_fd);
}
}
}
}