2015-11-12 4 views
0

Так что я должен сделать программу, что результаты выполнения аналогичны результатам после использования команды who и who am i in linux. проблема в том, что обе функции внутри if (strcmp ... и in else ... работают при разделении).Ошибка сегментации (ядро сбрасывается) C linux

Основная проблема заключается в том, что я должен иметь их как в одном файле, так и просто не работать. только для того, чтобы что-то сделать ./program am i и ./program сообщает о сбое сегментации (сбрасывается ядром).

Вторая проблема заключается в том, что я понятия не имею, как сделать часть ./program, я правильно работаю, она должна вернуться мне только мне: PTS пользователя/0 дата время ... не все пользователи, как в другой ... часть

#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

Пробовал ли вы использовать отладчик, чтобы сузить область возникновения сегментации? –

+4

* Где * произошел сбой? Запустите в отладчике, чтобы поймать сбой, когда поймаете, вы можете изучить и подобрать стек вызовов функций (дойти до * вашего * кода), а также изучить значения переменных. По крайней мере, пожалуйста, отредактируйте свой вопрос, чтобы показать, где в вашем коде произошел сбой, и значения задействованных переменных. –

+2

Вы, кажется, пропустили проверку на 'argc' и, видимо, вы вызываете программу с слишком небольшим количеством аргументов. Необходима информация Мор. –

ответ

0

Почему вы не попробовать использовать,

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

Непосредственное открытие и поиск файла utmp не рекомендуется. Файл utmp кажется нормальным файлом, который может свободно обращаться, но он ведет себя как база данных.

Смежные вопросы