日期:2014-05-16  浏览次数:20791 次

fork 父进程动态刷新,子进程做操作反馈给服务器,不能实现,求指教
pid = fork();
  if( pid < 0 )
  {
  perror( "fork error.\n" );
exit( EXIT_FAILURE );
  }
  if( pid > 0) //父进程实现动态刷新在线好友,从服务器端接收
  {
  //while( 1 )
{
  nbytes = recv( sockfd, online_buff, sizeof(online_buff), 0 );
if( nbytes < 0 )
{
fprintf( stderr, "接收数据错误..%s\n", strerror(errno) );
//continue;
}
else
{
  printf( "%s\n", online_buff );
if( nbytes != nbytes_temp )
{
nbytes_temp = nbytes;
  online_buff[nbytes] = '\0';
  printf( "%s\n", online_buff );
}
}
//sleep( 5 );
}/*end while 1*/
waitpid( pid, NULL, 0 );
  }
  if( pid == 0 )
  {
  printf( "子进程:\n" );
scanf( "%d", &choice2 );
printf( "%d\n", choice2 );
  }

1.首先感谢看这个帖子的人,第一次发帖子。我在学linux的网络编程,现在做的是聊天室
2.本程序部分代码已经贴出,我想实现父进程不断的读从服务器发来的消息,当有人上线的时候,服务器会发来消息,并动态
  更新在线的人
问题:
  1.不用while( 1 )的时候,不会产生阻塞,但是当另外的人登录聊天室,则不会收到更新的消息
  2.用while( 1 ) 能更新在线消息,但是会阻塞在那里。
  3.请指点一下,怎么个该法?或者其他的思路也可以,目的只有一个,简单的说就是父进程不断的读,当读到的在线人数
  与当前不一样就刷新, 子进程做相应的选择聊天处理
求大神!小弟刚毕业...

------解决方案--------------------
C/C++ code
pid = fork();
if( pid < 0 )
{
    perror( "fork error.\n" );
    exit( EXIT_FAILURE );
}
if( pid > 0) //父进程实现动态刷新在线好友,从服务器端接收
{
    while( 1 )
    {
        select(sockfd + 1, &r_set, NULL, NULL, NULL);  //这里应该判断select的返回值,我没有写
        if (FD_ISSET(sockfd, &r_set))
        {
            //可读
            nbytes = recv( sockfd, online_buff, sizeof(online_buff), 0 );
            if( nbytes < 0 )
            {
                fprintf( stderr, "接收数据错误..%s\n", strerror(errno) );
                //continue;
            }
            else
            {
                printf( "%s\n", online_buff );
                if( nbytes != nbytes_temp )
                {
                    nbytes_temp = nbytes;
                    online_buff[nbytes] = '\0';
                    printf( "%s\n", online_buff );
                }
            }
        }
        //sleep( 5 );
    }/*end while 1*/
    waitpid( pid, NULL, 0 );
}
if( pid == 0 )
{
    printf( "子进程:\n" );
    scanf( "%d", &choice2 );
    printf( "%d\n", choice2 );
}