2016-04-25 18 views
1

Cを使って開いている端末を確認しようとしています。端末に「w」と入力すると、端末が4つだけ開いていることがわかります開いた)。しかし、このコードを実行すると、約20のオープンがあることがわかります。これをどうやって解決するのですか?cを使って開いている端末を確認する方法

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 
#include <unistd.h> 
#include <sys/wait.h> 
#include <signal.h> 
#include <time.h> 


const char pts[] = "/dev/pts/"; 
int s1=0; 

FILE *fp = NULL; 
char *terminal[4]; 
char* check; 

int main(int argc, char *argv[]){ 

int i; 
char strDev[100]; 

for(i=0; i<100; i++){ 
    sprintf(strDev, "%s%d", pts, i); 
    printf("Opening %s...\n", strDev); fflush(stdout); 

    if((fp = fopen(strDev, "w")) == NULL) ; 
    else{ 

    printf("\tOpened %s\n", strDev); fflush(stdout); 

    terminal[s1] = strDev; 
    s1++; 
    } 
} 
return 0; 
} 
+1

ポータブルCではこれを行うことはできません。その標準はそれのための手段を提供しません。システム固有の方法で実行する必要があるため、少なくともオペレーティングシステムを指定する必要があります。 – Dolda2000

+1

記録のために、 'w'コマンドは' utmp'ファイルを使用しています。したがって、あなたがやることと同じようにするには、マンページを参照してください。しかし、これはターミナルが開いているかどうかを確認することとまったく同じことではありません。 – Dolda2000

+2

プログラムは開いている端末の数を確認していますが、開いている端末の数はありません。 –

答えて

0

なぜwコマンドはありませんあなたが使用しているだけで何やってsystemコマンドを使用していない:

#include <stdlib.h> 
#include <stdio.h> 

int main(int argc, char *argv[]) { 

    char command[128]; 
    snprintf(command, sizeof(command), "w"); 
    system(command); 

return 0; 
} 
1

wが合理的にポータブルで実行しています。しかし、ヘッダーではなく、カウントだけが必要です。 の最初の行は、通常の実際のユーザー数を示すステータス行です(ただし、Cで解析するのは難しい)。ヘッダーの残りの行は、最初の列から始まる列名を示します。 wまたはそのフォーマットについては、はありません。が標準です。 POSIXではwhoと記述されていますが、使用する書式の説明は避けています。だから、wのために:

#include <stdio.h> 
int 
main(void) 
{ 
    int result = 0; 
    FILE *fp; 
    if ((fp = popen("w", "r")) != 0) { 
     int lineno = 0; 
     char *buffer = 0; 
     size_t size = 0; 
     int head = 0; 
     while (getline(&buffer, &size, fp) > 0) { 
      if (lineno++ == 0) { 
       head = (*buffer != ' ') ? 2 : 1; 
      } else if (head++ > 1) { 
       ++result; 
      } 
     } 
     pclose(fp); 
    } 
    printf("%d terminals are open\n", result); 
    return 0; 
} 

あなたが使用中の端末を知りたい場合は、それを行うための方法は、ヘッダから列情報を使用して、次の行からテキストを選択することであろう。適用可能な標準がない場合、列の幅(および順序)はシステムによって異なる可能性があるため、特定のオフセットおよび文字列長を使用するソリューションには欠陥があります。

しかし、一部のシステムでは、対応する特別なデバイスが保護され、通常の(特権を持たない)プログラムがそれらを開くことができないため、利用可能な(未使用の)端末のリストを表示するために、彼らの存在。

関連する問題