2016-04-25 11 views
1

Ich versuche zu überprüfen, welche Terminals mit C geöffnet sind. Wenn ich "w" in das Terminal eingibt, zeigt es, dass nur 4 Terminals geöffnet sind (das ist tatsächlich, wie viele Terminals ich habe öffnen). Allerdings, wenn ich diesen Code ausführe, sagt es mir, dass es etwa 20 offen sind. Wie behebe ich das?Wie überprüft man, welche Klemmen offen sind mit 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

Sie können dies nicht mit tragbaren C; Der Standard bietet keine Mittel dafür. Es muss auf eine systemspezifische Art und Weise durchgeführt werden, so dass Sie zumindest Ihr Betriebssystem angeben müssen. – Dolda2000

+1

Für den Datensatz verwendet der 'w'-Befehl die' utmp'-Datei. Wenn Sie also das Gleiche tun möchten, was Sie tun, lesen Sie die Hilfeseite. Das ist nicht das Gleiche, als zu prüfen, welche Terminals offen sind. – Dolda2000

+2

Ihr Programm überprüft, wie viele Terminals es öffnen kann, nicht welche bereits geöffnet sind. –

Antwort

0

Warum verwenden Sie den Befehl system nicht nur, was die w Befehl zu tun hat Sie verwenden:

#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

Lauf w maßen tragbar ist. Aber nur die Zählung wird benötigt, nicht die Header. Die erste Zeile der Header normalerweise ist eine Statuszeile, die die tatsächliche Anzahl der Benutzer angibt (aber ungeschickt in C zu analysieren), und die verbleibende Zeile der Header zeigt die Spaltennamen, beginnend in der ersten Spalte. Es gibt keine Standard für w oder sein Format. POSIX beschreibt who, vermeidet jedoch die Beschreibung des verwendeten Formats. Also, für 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; 
} 

Wenn Sie möchten wissen, welche Endgeräte im Einsatz sind, die Möglichkeit, dies zu tun wäre, um die Spalteninformationen aus dem Header zu verwenden und den Text aus folgenden Zeilen auszuwählen. Ohne anwendbaren Standard kann die Breite (und Reihenfolge) der Spalten von System zu System variieren, so dass jede Lösung, die bestimmte Offsets und String-Längen verwendet, fehlerhaft ist.

Um jedoch eine Liste der verfügbaren (unbenutzten) Terminals anzuzeigen, sind Sie allein, weil auf einigen Systemen die entsprechenden speziellen Geräte geschützt wären, so dass normale (nicht-privilegierte) Programme sie nicht öffnen könnten ihre Existenz.

Verwandte Themen