2015-11-12 1 views
0

Donc, je dois faire un programme que les résultats d'exécution sont similaires à ceux après l'utilisation de la commande who et who is i in linux. le problème est que les deux fonctions à l'intérieur de if (strcmp ... et dans else ... fonctionnent quand elles sont séparées.)Défaut de segmentation (core dumped) C linux

Le problème principal est que je dois les avoir tous les deux dans un fichier, et cela ne fonctionne tout simplement pas. mis en place seulement que faire quelque chose ./program am i, et ./program raconte erreur de segmentation (core dumped)

Deuxième problème est que je n'ai aucune idée de comment faire partie ./programme suis-je travailler correctement il devrait retourner moi que moi: pts utilisateur/0 date heure ... pas tous les utilisateurs comme dans d'autre ... partie

#include <stdio.h> 
#include <utmp.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <time.h> 
#include <string.h> 
#include <sys/types.h> 

#define SHOWHOST 

void show_info_who(struct utmp *utbufp) 
{ 
    if(utbufp->ut_type > 4){ 
     time_t czas = utbufp->ut_time; 
     char buf[80]; 
     struct tm* timeinfo = localtime(&czas); 

     printf("%-8.8s", utbufp->ut_name); 
     printf(" ");     
     printf("%-8.8s", utbufp->ut_line); 
     printf(" ");     
     strftime(buf, 80, "%F %R" , timeinfo); 
     printf("%s", buf); 
     printf(" ");     


    #ifdef SHOWHOST 
     printf("(%s)", utbufp->ut_host);  
    #endif 
     printf("\n");    
    } 
} 


int main(int argc, char *argv[]) 
{ 
    struct utmp current_record; 
    int  utmpfd;  
    int  reclen = sizeof(current_record); 

    if ((utmpfd = open(UTMP_FILE, O_RDONLY)) == -1){ 
     perror(UTMP_FILE); 
     exit(1); 
    } 

    if(strcmp (argv[1], "am") == 0){ 
     if(strcmp (argv[2], "i") == 0){ 
      while (read(utmpfd, &current_record, reclen) == reclen) 
       show_info_who(&current_record); 
       printf("test\n"); 
     } 

    close(utmpfd); 
    return 0; 
    } 

     while (read(utmpfd, &current_record, reclen) == reclen) 
      show_info_who(&current_record); 
     close(utmpfd); 

     return 0; 


} 
+5

Avez-vous essayé d'utiliser un débogueur pour affiner l'emplacement de la panne de segmentation? –

+4

* Où * l'accident est-il survenu? Exécuter dans un débogueur pour attraper le crash, quand vous êtes pris, vous pouvez examiner et remonter la pile des appels de fonction (aller jusqu'à * votre * code) et aussi examiner les valeurs des variables. À tout le moins s'il vous plaît modifier votre question pour montrer où dans votre code le crash se produit, et les valeurs des variables impliquées. –

+2

Vous semblez ignorer la vérification de 'argc' et apparemment vous invoquez le programme avec trop peu d'arguments. Mor informations nécessaires. –

Répondre

0

Pourquoi vous essayez de ne pas utiliser,

.
void setutent(void); // for rewinding 
struct utmp *getutent(void); 

L'ouverture directe et la recherche du fichier utmp est déconseillée. Un fichier utmp semble être un fichier normal auquel vous pouvez accéder librement, mais il se comporte comme une base de données.