2017-11-21 4 views
0
fd_set read_fds; 
struct timeval tv; 
while(1){ 
    tv.tv_sec = 3; 
    tv.tv_usec = 0; 
    FD_ZERO(&read_fds); 
    FD_SET(0,&read_fds); 
    FD_SET(pipelogin,&read_fds); 
    nfd = select(1,&read_fds,NULL,NULL,&tv); 
    if(FD_ISSET(0,&read_fds)){ 
     printf("Comando"); } 
     //comandos(); 
    if(FD_ISSET(pipelogin,&read_fds)){ 
     printf("Login"); } 
     //VerificaLogin(pipelogin); 
} 

私の関数 "comandos()"はユーザーからのコマンドを読み込んで何かをし、VerificaLogin(pipelogin)の機能を実行するだけでユーザーのログインを許可します。私はユーザー "comando"を一度しか使えず、VerificaLoginは最初の "comando"の後でしか動かないのです...誰かがここで何が間違っているのか教えてくれますか? 悪い英語で申し訳ありません。選択しないUnix C

+3

'select'の最初のパラメータは、少なくとも1にセットの最大ファイル記述子を加えた値にする必要があります。 '0'と' pipelogin'の2つのファイル記述子しか持たないので、 'pipelogin'はその集合の最大ファイル記述子になりますので、最初のパラメータを' pipelogin + 1'に設定します: 'nfd = –

+0

@IanAbbott) [poll(2)](http://man7.org/linux/man-pages/man2/poll.2.html)を古くから廃止された 'select'に追加し、最後に' \ n'を入れます'printf'フォーマット文字列の' fflush'を使ってください。 –

+1

問題の最小限の実行可能なデモンストレーションを提供してください([mcve]を参照してください)。 – ikegami

答えて

1

select機能は、ステータスレポート機能です。状態が変わらない限り、同じ状態を報告し続けます。

また、はありません。は、ブロッキングソケット付きselectです。それは痛みを引き起こすだけです。

関連する問題