Advertisement
agetmanova

OC Lab02

Apr 7th, 2020
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.72 KB | None | 0 0
  1. #include <sys/types.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4. #include <stdlib.h>
  5. #include <errno.h>
  6.  
  7. extern char *tzname[];
  8.  
  9. int main()
  10. {
  11.     time_t now;
  12.     struct tm *sp;
  13.     errno = 0;
  14.     char *s_time;
  15.  
  16.     setenv("TZ", "PST8PDT", 1);
  17.     if (errno == -1)
  18.     {
  19.         perror(" Setenv failure");
  20.         exit(EXIT_FAILURE);
  21.     }
  22.  
  23.     (void) time( &now );
  24.     if (errno == -1)
  25.     {
  26.         perror("Time failure");
  27.         exit(EXIT_FAILURE);
  28.     }
  29.     s_time = ctime(&now);
  30.     if(s_time == NULL)
  31.     {
  32.         perror("ctime failure"):
  33.         exit(EXIT_FAILURE);
  34.     }
  35.     printf("%s", s_time);
  36.  
  37.     sp = localtime(&now);
  38.     if (sp == NULL)
  39.     {
  40.         perror("Localtime failure");
  41.         exit(EXIT_FAILURE);
  42.     }
  43.  
  44.     printf("%d/%d/%02d %d:%02d %s\n",
  45.            sp->tm_mon + 1, sp->tm_mday,
  46.            sp->tm_year + 1900, sp->tm_hour,
  47.            sp->tm_min, tzname[sp->tm_isdst]);
  48.     exit(0);
  49. }
  50.  
  51. Программа выводит время и дату в калифорнии в двух вариантах в формате:
  52. День Недели Месяц День Час:Минута:Секунда Год
  53. Месяц/День/Год Час:Минута Часовой Пояс
  54. Пример:
  55. Mon Apr  6 22:03:52 2020
  56. 4/6/2020 22:03 PDT
  57.  
  58. Часовой пояс в Калифорнии PST, но уже перешли на летнее время, поэтому PDT - Pacific Daylight Time.
  59.  
  60. extern char *tzname[]; объявление переменной tzname,в которой хранится название часового пояса.
  61. setenv("TZ", "PST8PDT", 1); функция меняет значение переменной среды TZ на стандартное название часового пояса.
  62.  
  63. Переменная среды - текстовая переменная операционной системы. Изменение переменной среды в одном процессе не повлияет на другой процесс, то есть переменные среды локальны для каждого процесса. Переменные среды хранятся на стеке процесса, наследуются дочернему процессу от родительского (на стек передаются копии переменных).
  64. Процесс - это экземпляр исполняющейся программы вместе с данными этой программы и атрибутами.
  65. На каждый процесс заводится пользовательская область - сегмент данных, содержащий информацию, необходимую при исполнении процесса.
  66. В адресном пространстве помимо стека есть сегмент текста, данных, а так же разделяемая память и данные динамических библиотек. Сегмент текста содержит команды, полученные из кода, написанного пользователем. Сегмент данных содержит статические и внешние переменные.
  67.  
  68. (void) time( &now ); функция time возвращает количество секунд прошедшее с 1/1/1970 00:00 UTC.
  69.  
  70. UTC(Coordinated Universal Time) - это всемирное координированное время, стандарт времени, принятый на Земле. От UTC отсчитываются часовые пояса. UTC заменил устаревшее время по Гринвичу (GMT).
  71.  
  72. printf("%s", ctime( &now ) ); ctime преобразовывает количество секунд полученных time и записанных в переменную &now в строку вида "День Недели Месяц День Час:Минута:Секунда Год".
  73.  
  74. struct tm *sp; объявление структуры, содержащей такие поля:
  75. struct tm {
  76.       int tm_sec;    /* seconds after minute [0,61] */
  77.       int tm_min;    /* minutes after the hour [0,59] */
  78.       int tm_hour;   /* hour since midnight [0,23] */
  79.       int tm_mday;   /* day of the month [1,31] */
  80.       int tm_mon;    /* months since January [0,11] */
  81.       int tm_year;   /* years since 1900 */
  82.       int tm_wday;   /* days since Sunday [0,6] */
  83.       int tm_yday;   /* days since January 1 [0,365] */
  84.       int tm_isdst;  /* flag for alternate daylight savings time */
  85.       };
  86. sp = localtime(&now); получает переменную типа time_t, содержащую количество секунд с 1/1/1970 00:00 UTC и возвращает адрес структуры tm с заполненными полями в соответствии. Использует функцию tzset, чтобы получить переменную среды TZ.  На   основании   этого   значения   tzset инициализирует  массив   указателей  на  строки  tzname  и  внешние переменные timezone и  altzone.  timezone  устанавливается  равной разнице времени  между UTC  и данной временной зоной, измеренному в секундах.
  87. Поле tm_isdst  структуры tm  при вызове  функций localtime устанавливается положительным,  если действует  сезонное  изменение времени, нулевым, если оно не действует, и отрицательным, если информация недоступна.
  88. Внешняя переменная  daylight устанавливается  положительной, только если в данной TZ используется сезонное изменение времени.
  89.  
  90.  if (sp == NULL)
  91.     {
  92.         perror("Localtime failure");
  93.         exit(EXIT_FAILURE);
  94.     }
  95. perror  выводит   в  стандартный  вывод  диагностики  сообщение, описывающее последнюю  ошибку, обнаруженную при вызове системной или библиотечной функции. Сначала печатается строка параметра s, затем двоеточие и пробел, затем сообщение об ошибке по текущему значению errno и перевод строки. Внешняя переменная errno, устанавливается при  ошибочном, но  не  очищается  при  успешном системном вызове.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement