2011-08-21 131 views
0

由叉產生的過程我寫代碼併發服務器。我希望看到在fork()調用生成的子服務器套接字的終端輸出。客戶端正在與子服務器套接字進行通信,我希望看到客戶端在服務器上寫入的數據。那我怎麼能在終端上看到它?如何查看在終端輸出()

我的服務器代碼:

while(1) 
    { 
     clilen=sizeof(cliaddr); 
     connfd=accept(sockfd,(struct sockaddr*)&cliaddr,&clilen); 
     printf("connection accepted\n"); 
     if((childpid=fork())==0) 
      { 
      close(sockfd); 
      printf("child process\n"); 
      str_echo(connfd); 
      // str_echo(connfd); 
      exit(0); 
      } 
    printf("connection established\n"); 

str_echo()

void str_echo(int sockfd) 
    { 
     char buff[20]; 
     ssize_t n; 
     while(1) 
      { 
      if((n=read(sockfd,buff,20))>=0) 
       write(sockfd,buff,20); 
      else 
       write(sockfd,"blank",20); 
      //else 
      printf("%s",buff); 
      // write(sockfd,buff,20); 
       //return; 
      //else 
      // writen(sockfd,buff,n); 
      } 
    } 

,但我沒有在終端

+0

也許問題是,'閱讀()'還沒有恢復?你可以嘗試在'str_echo'的開頭加上'print',看看你是否看到了。 – Owen

+0

父進程的stdout是否重定向?你能不能在fork,printf,exit和wait之類的代碼中重現這個問題? –

回答

2

獲得輸出上面printf("%s",buff);str_echo()通常分叉()進程共享它父母文件描述符,特別是它應該具有相同的stdout。所以我認爲你應該能夠看到輸出而不做任何特殊的設置。

+0

沒有我試圖對服務器的代碼: 如果((childpid =叉())== 0){ 接近 (的sockfd); str_echo(connfd); ((n = read(sockfd,buff,20))> = 0) write(sockfd,buff,20); 其他 寫(的sockfd, 「空白」,20); //別的 的printf( 「%S」,淺黃色); 但是我沒有得到在終端輸出的printf( 「%S」,淺黃色) –

+1

嘗試'的printf( 「%S \ n」 個,淺黃色);'。 – cnicutar

+0

@subh。唱歌對不起,如果這聽起來像一個愚蠢的問題,但不是因爲它被註釋掉了嗎?你也可以把代碼放在問題中,以便更容易看到。 – Owen