2013-08-10 3 views
1

Я новичок в этом форуме и программировании на C. Я хочу отображать время модификации tty перед сном и после сна (если я ввожу что-то на терминал во время сна). Я использую следующий код, но если я объявляю struct stat как глобальную переменную, это дает правильное время модификации, но не меняет его после сна. С другой стороны, я объявляю struct stat как локальную переменную, она дает мне совершенно неправильную дату, но, похоже, меняет дату после сна. Я пытаюсь понять это в течение двух дней, но не повезло. Пожалуйста, помогитеc программирование получить время модификации tty после сна

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <time.h> 
#include <unistd.h> 
#include <signal.h> 
#include <stddef.h> 
#include <string.h> 

char *modTime; 
void getmt(); 
time_t modifiedTime; 

//struct stat statbuf; //this gives the correct modification time but does not change it after sleep 

int main(int argc, char **argv) 
{ 
    int i, status = 0; 
    time_t now; 

    if (argc == 1) { 
     fprintf(stderr, "usage: %s file \n", argv[0]); 
     return(1); 
    } 

    for (i = 1; i < argc; i++) 
    { 
     struct stat statbuf; 

     if (lstat(argv[i], &statbuf)) { 
      perror(argv[i]); 
      status = 1; 
     } 
     else 
     { 
      getmt(); 
      time(&now); 
      printf("\nNOW %ld\n", now); 
      sleep(20); 
      time(&now); 
      printf("after sleep %ld\n", now); 
      getmt(); 
     } 
    } 

    return(status); 
} 

void getmt() 
{ 
    struct stat statbuf; //this does not give correct modification time but changes it after sleep 
    time_t modifiedTime; 

    //modification time of tty as string 
    modTime = ctime(&statbuf.st_mtime); 
    printf("\n last modified time as string %s\n", modTime); 

    //modification time of tty as long date 
    modifiedTime = statbuf.st_mtime; 
    printf ("last modified time as long date %ld\n", modifiedTime); 
} 

ответ

0

struct stat statbuf внутри getmt() никогда не инициализируется, поэтому она полна значений мусора. Обратите внимание: хотя он имеет то же самое имя как глобальную переменную (закомментированный), это другой объект, живущий на другом адресе, созданный, когда getmt() запускается и уничтожается снова, когда возвращается getmt().

lstat звонок заполняется struct stat объектом в то время, когда он называется. Вы вызываете его только один раз в цикле per-argv, поэтому вы получите только одно значение времени. Вы должны снова позвонить lstat после sleep(), чтобы узнать, изменилось ли время изменения.

+0

Отличный !! это сработало. Спасибо, Торек. – Gantavya

0

Я попытался сделать так, как предлагал торек, но он работал только частично, поскольку он меняет время модификации независимо от того, как я касаюсь клавиатуры (во время сна) или нет. Вот что я сделал

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <time.h> 
#include <unistd.h> 
#include <signal.h> 
#include <stddef.h> 
#include <string.h> 


char *modTime; 
void getmt(); 
time_t modifiedTime; 

struct stat statbuf; 


int main(int argc, char **argv) 
{ 
    int i, status = 0; 
    time_t now; 


if (argc == 1) { 
fprintf(stderr, "usage: %s file \n", argv[0]); 
return(1); 
} 

for (i = 1; i < argc; i++) 
{ 
    //struct stat statbuf; 

    if (lstat(argv[i], &statbuf)) { 
    perror(argv[i]); 
    status = 1; 
    } 

    else 
    { 

    getmt(); 


    time(&now); 
    printf("\nNOW %ld\n", now); 


} 
} 


    sleep(20); 

    for (i = 1; i < argc; i++) 
{ 

    if (lstat(argv[i], &statbuf)) { 
    perror(argv[i]); 
    status = 1; 
    } 

    else 
    { 


    time(&now); 


    printf("after sleep %ld\n", now); 
    getmt(); 

    } 



}//for 


    return(status); 
} 


void getmt() 
{ 

time_t modifiedTime; 

//modification time of tty as string 
modTime = ctime(&statbuf.st_mtime); 
    printf("\n last modified time as string %s\n", modTime); 


     //modification time of tty as long date 
     modifiedTime = statbuf.st_mtime; 

    printf ("last modified time as long date %ld\n", modifiedTime); 

} 
+0

Предложение torek полностью работало после того, как я поместил все в блок вместо вызова getmt(). – Gantavya

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

  • Нет связанных вопросов^_^