-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patherrata_lectures.txt
More file actions
449 lines (399 loc) · 32.2 KB
/
errata_lectures.txt
File metadata and controls
449 lines (399 loc) · 32.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
Опечатки, ошибки и неточности, обнаруженные в лекциях и презентациях курса, включая примеры исходного кода и иллюстрации.
1 января 2022
2.1 Понятия, связанные с процессом
2:31 Стрелочка между процессом 2 и ресурсом 1 должна идти в обратном направлении (процесс 2 запрашивает ресурс 1, а не наоборот).
Эта же ошибка есть и в презентации.
2.5 Создание процесса в ОС UNIX
Презентация. Страница 55.
Опечатка:
вместо
"Копирование таблицы пользовательских дескрипторов файлов, открытых процессов"
должно быть
"Копирование таблицы пользовательских дескрипторов файлов, открытых процессом-родителем"
3.2 Информационные связи между параллельными процессами
3:51
Про передачу внешних аргументов через символьный или байтовый массив... В одном символьном
массиве через СВ группы execl() можно передать только один аргумент.
Несколько внешних аргументов посредством одного символьного массива можно передать лишь в СВ system().
Массив в этом случае будет использоваться для формирования команды, включающей имя программы и множество
ее внешних аргументов.
Формулировка же про использование одного символьного массива для передачи нескольких
внешних аргументов в СВ execl() вводит в заблуждение. Для того, чтобы чтобы передать произвольное
число аргументов в семейство СВ exec() нужен массив указателей на символьные массивы с аргументами
командной строки (по одному указателю на каждый аргумент). Должно присутствовать как минимум 2 аргумента:
имя программы, которое отобразится в элемент newargs[0], и значение NULL, завершающее список. Первый
указатель – имя программы, последний – нулевой указатель. Нулевой указатель должен находиться в конце
списка аргументов, чтобы данные вызовы могли определить конец.
Затем нужно передать адрес этого массива
указателей в качестве аргумента одного из СВ exec(), заканчивающихся на букву v.
Пример из https://progi.pro/argumenti-peredayutsya-v-execv-v-c-11223742
char *const newargs[4] = { "echo", "Hello World", NULL };
execv("/bin/echo", newargs);
Другой вариант, как можно задать массив указателей:
char *newargs[3];
newargs[0]= "echo";
newargs[1]= "Hello World";
newargs[2] = (char*)NULL; // mandatory last NULL pointer
execv("/bin/echo", newargs);
Эти вызовы удобны, когда заранее неизвестно число аргументов вызываемой программы.
Поэтому execl() полезен только с фиксированным числом аргументов (или, по крайней мере, когда существует
небольшая фиксированная верхняя граница числа аргументов). Чаще всего execv() - лучший выбор.
UNIX. Профессиональное программирование. 3-е изд. У. Ричард Стивенс, Стивен А. Раго (2018), стр. 310:
"Одно из различий между этими функциями касается передачи списка аргументов (символ l в
имени означает список (list), v — вектор, или массив (vector)). Функции требуют, чтобы
каждый из аргументов командной строки новой программы был оформлен в виде
отдельного аргумента функции. Конец списка аргументов отмечается пустым указателем. Для других
четырех функций (execv, execvp, execve и fexecve) необходимо сформировать массив указателей
на аргументы командной строки и передать адрес этого массива в качестве аргумента."
3.6 Ожидание завершения «родственного» процесса
4:00
"Если аргумент функции exit() - двойка, то двойка в двоичной системе записывается, как 11"
- ошибка, двойка в двоичной системе записывается как 10. Значение 11 же обозначает тройку.
Далее в видео рассматривается пример именно тройки, а не двойки.
4.1 Понятия файла, файловой системы, дескриптора файла
10:02
оговорка - произвольная организация файлов названа последовательной
4.2 Реализация файлов
6:12
кБ вместо кБ
МБ вместо Мб
Б вместо б (маленькая буква б означает бит)
Эти же опечатки есть и в презентации
Строго говоря, по стандартам МЭК (https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B3%D0%B0%D0%B1%D0%B0%D0%B9%D1%82) нужно использовать
кибибайты КиБ
и
мебибайты МиБ
11:01
20 ЭБ вместо 20 Эб
Эта же опечатка есть и в презентации
11:14 Эта технология предложена корпорацией Apple.
Это утверждение ошибочное - NTFS детище Microsoft.
https://en.wikipedia.org/wiki/NTFS
NTFS (New Technology File System) is a proprietary journaling file system developed by Microsoft. Starting with Windows NT 3.1, it is the default file system of the Windows NT family.
https://www.cnews.ru/news/top/2020-08-17_rossiyane_podarili_linux_drajver
NTFS (New Technology File System, «файловая система новой технологии») – стандартная файловая система для семейства операционных систем Windows NT (куда входит в том числе и Windows 10) корпорации Microsoft. Впервые представлена в 1993 г. Спецификации NTFS закрыты, что значительно усложняет разработку драйверов для ее поддержки.
Файловые системы, разработанные Apple:
• HFS (Hierarchical File System, иерархическая файловая система).
• HFS Plus или HFS+ или Mac OS Extended.
• Apple File System или APFS.
4.3 Файлы в файловой системе Unix-подобных ОС
7:17
Б вместо б (маленькая буква б означает бит)
4.4 Файлы в файловой системе Unix-подобных ОС (продолжение)
11:33
Лишняя буква "к":
"с клиентским гнездом, к которое"
правильный вариант:
"с клиентским гнездом, которое"
Эта же ошибка есть и в презентации.
5.5 Системные вызовы и утилиты, позволяющие получить информацию о файле
19:38
В лекции утверждается, что функция stat возвращает структуру с информацией о файле по ее индексному дескриптору. Однако функция stat возвращает структуру с информацией о файле, указанном в аргументе pathname и не нуждается в предварительном открытии файла, как это сказано в лекции. Информацию же об открытом файле по его дескриптору fd возвращает другая функция - fstat.
Поэтому представленном коде примера и лекции содержится ошибка несоответствия:
1. либо в 13 строке кода вместо функции stat должна быть fstat:
lstat(fd, &buff);
2. либо же в лекции должен быть рассказ о функции stat, а не lstat.
Эта же ошибка есть и в презентации.
См.:
UNIX. Профессиональное программирование. 3-е изд. У. Ричард Стивенс, Стивен А. Раго (2018), стр. 137
6.2 Системный вызов creat(). Права доступа к файлу
13:45
права доступа 075.
Видимо, благодаря указанию нуля в начале числа, система понимает, что имеет дело с восьмеричной записью.
6.3 Системные вызовы dup(), dup2(). Примеры реализаций
00:14-03:11
должно быть
fd=dup(0); //fd =3
вместо
fd=dup(1); //fd =3
т.к. в ТПДОФП на слайде показано копирование нулевого дескриптора файла стандартного ввода STDIN=0, открытого на чтение
Эта же ошибка есть и в презентации.
6.4 Перенаправление стандартного ввода-вывода
0:20
На слайде код программы заканчивается _exit(1), однако в дальнейшем, начиная с 7:11 код программы в этом месте изменяется на _exit(2).
Это же несоответствие есть и в презентации.
7.1 Логическая и физическая организация системы управления УВВ
4:54
Судя по дальнейшим материалам лекции, определение
Кэш-память – системные буфера ввода-вывода размером с блок
должно быть уточнено
Кэш-память — системные буферы ввода-вывода с размером, кратным размеру блока
7.3 Системный вызов write()
3:50
В примере использования вместо него приведен СВ read()
Эта же ошибка есть в презентации.
7.4 Примеры реализаций системных вызовов ввода-вывода информации
7:55 в начале аргумента " Hello" первого СВ write() добавлен лишний пробел.
Эта же опечатка есть и в презентации.
8.3
0:14-5:30
Пропущен заголовочный файл, необходимый для СВ wait()
#include <sys/wait.h>
Эта же ошибка есть и в презентации.
8.4 Передача информации через межпроцессный канал (продолжение)
0:14-7:40
Пропущен заголовочный файл, необходимый для СВ wait()
#include <sys/wait.h>
Пропущен заголовочный файл, необходимый для СВ memset()
#include <string.h>
Пропущен заголовочный файл для возможности мобильного переноса с одной вычислительной платформы на другую
#include <unistd.h>
Эти же ошибки есть и в презентации.
10:24
Лишяя метка "fd[1]" у 5 строки пустой ТПДОФ процесса-сына после функции exit()
Эта же ошибка есть и в презентации.
11:58 Оговорка: "Таблица пользовательских дескрипторов открытых файлов (ТПДОФ) в процессе-отце будет пустая".
На самом деле речь идет о ТПДОФ в процессе-сыне.
9.1 Понятие сигнала. Типы сигналов в ОС UNIX
1:10
Пропущена запятая:
вместо
...на различные события которые могут произойти
должно быть
...на различные события, которые могут произойти
1:43
Пропущена запятая:
вместо
События инициирующие сигнал:
должно быть
События, инициирующие сигнал:
Эти же ошибки есть в презентации.
9.2 Поддержка сигналов ядром ОС UNIX
6:17
кроме <signal.h> в заголовочных файлах должен находиться
#include <stdlib.h> // Для СВ system()
Эта же ошибка есть в презентации.
9.4 Системные вызовы манипулирования сигнальной маской процесса. Часть 1
0:09
вместо
SIG_SETMAK
должно быть
SIG_SETMASK
Эта же ошибка есть в презентации.
10:10 Ошибка в описании возвращаемого значения функцией sigismember()
вместо
"Возвращает 1, если в маске mask установлен (= 1) бит
сигнала sig и 0 – иначе.
Возвращает 0 в случае успеха, и -1 – в случае неудачи."
должно быть
"Возвращает 1, если в маске mask установлен (= 1) бит
сигнала sig и 0 – иначе.
Возвращает -1 в случае неудачи."
или
"Проверяет состояние указанного разряда (установлен ли в маске mask единичный бит для сигнала sig). Возвращает 1 (истина), 0 (ложь) и –1 — в случае ошибки."
Т.е. для нулевого возвращаемого значения указаны две расшифровки.
Эта же ошибка есть в презентации.
9.5 Системные вызовы манипулирования сигнальной маской процесса. Часть 2
6:01 "else" здесь не требуется. Во-первых, если возникнет ошибка, процесс итак будет завершен, а во-вторых, здесь несколько нарушена логика: почему-то else обрамляет только первый блок if, тогда как второй блок if идет вне его.
Эта же неточность есть в презентации.
10.1 Системный вызов sigaction()
В лекции и в презентации не указано, что СВ sigaction() возвращает 0 в случае успеха, –1 — в случае ошибки.
10.3 Библиотечные функции безусловного нелокального перехода
4:53
Ошибка в описании синтаксиса функции siglongjmp(). Функция не возвращает никакого значения. Вместо
int siglongjmp(sigjmp_bufstack, int val);
должно быть
void siglongjmp(sigjmp_bufstack, int val);
Т.е. возврат из функции siglongjmp() не происходит, так как стек возвращается в сохраненное состояние, но при этом происходит выход из соответствующего вызова sigsetjmp().
Эта же ошибка есть в презентации.
10.4 Примеры реализации безусловного перехода
6:31
Во-первых, для использования библиотечной функции system() нужно добавить заголовочный файл
#include <stdlib.h>
Во-вторых, команда
ls -l
выводит не текущую дату и время, а содержимое домашней папки в виде списка с максимальным количеством информации и разделением вывода на отдельные колонки.
Для получения текущих даты и времени в стандартном формате нужно выполнить команду:
date
Эти же ошибки есть в презентации.
10.5 Примеры реализации безусловного перехода. Пример 2
3:19
Максимальная длина имени файла в UNIX-подобных ОС - 256 байт, включая завершающий нулевой символ, который показывает конец имени. Однако, в лекции "4.1 Понятия файла, файловой системы, дескриптора файла" 13:32 при описании дескриптора файла было сказано, что максимальная длина символьного имени файла 252 байта. Затем в лекции "4.3 Файлы в файловой системе Unix-подобных ОС" 7:16 при описании каталогов указано, что информация о файлах хранится в виде записей, длина записи 256 байт (4 байта под номер i-узла, 252 байта под имя). В лекции "4.4 Файлы в файловой системе Unix-подобных ОС (продолжение)" с 0:08 по 0:46 это говорит лектор.
11.2 Пример реализации
1:53
Выделение памяти под лишнюю переменную fd, которая в программе затем никак не используется:
int fd;
Эти же переменная есть и в презентации.
11.3 Пример реализации (продолжение)
9:54
При дублировании записи с номером p[1] в пользовательский дескриптор файла стандартного вывода (первую запись), запись №1 в ТПДОФ сына должна содержать pipe_w, а не /dev/tty_w
Эта же ошибка есть в презентации.
13:30-20:50
В правом верхнем углу экрана до конца презентации сохраняется старая, не актуальная версия ТПДОФ отца, новая версия которой уже представлена на слайде.
Эта же лишняя ТПДОФ есть девяти слайдах презентации.
14:08 - 16:10
В прамом верхнем углу стрелочка "file*" и надписи p[0] и p[1] рядом со старой версией ТПДОФ отца съехали на одну строку вниз.
Эте же ошибка есть на трех слайдах в презентации.
16:11
Над ТПДОФ второго сына написано "Внук" вместо "Сын 2"
А в нулевой записи этой таблицы вместо "pipe_r" написано "1pipe_w"
Эти же ошибки есть в презентации.
19:16
В коде приведен неверный комментарий:
/* Код процесса внука */
Правильный вариант:
/* Код процесса второго сына */
Эта же ошибка есть в презентации.
19:16 - 20:51
В записи №5 в ТПДОФ отца вместо "1pipe_r" написано "pipe_r"
Эта же ошибка есть в 3 слайдах презентации.
19:16 - 19:41
Стрелочка "Результат grep" указывает на нулевую запись в таблице ТПДОФ отца, а должна указывать на запись №5, ведь перенаправление ввода еще не осуществлено.
20:17 - 20:50
В нулевой записи ТПДОФ отца вместо "1pipe_r" написано "pipe_r"
Эта же ошибка есть в презентации.
20:52
Пропущены две строки и открывающая/закрывающая фигурные скобки:
count++; // увеличение счетчика сигналов
if (count == 3)
{ .... }
Эта же ошибка есть в презентации.
11.4 Пример реализации (продолжение). Часть 2
0:04
Здесь, также как в «11.2 Пример реализации», присутствует переменная fd, которая в программе затем никак не используется.
Эта же переменная есть в презентации.
0:32 "Заголовочные файлы остались те же самые. Мы их не меняем"
- Это не так. Добавлена строка
#include <signal.h> /* Для работы с сигнальной маской процесса и макросами,
прототипами данных из функции sigaction() */
3:50
На скриншоте присутствуют два лишних заголовочных файла и лишняя переменная abuf:
#include <sys/types.h>
#include <setjmp.h> /* Нелокальные переходы. Содержит прототипы функций
безусловного нелокального перехода sigsetjmp()
и siglongjmp(), а также определения связанных
с ними структур данных */
sigjmp_buf abuf;
Кроме того, здесь, также как в «11.2 Пример реализации», присутствует переменная fd, которая в программе затем никак не используется.
Эти же переменные и заголовочные файлы есть в презентации.
12.2 Распределение оперативной памяти на основе страничной подкачки
0:25-1:23
кБ вместо кБ
т.к. Б вместо б (маленькая буква б означает бит)
Строго говоря, по стандартам МЭК (https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B3%D0%B0%D0%B1%D0%B0%D0%B9%D1%82) нужно использовать
кибибайты КиБ
Эта же опечатка есть и в презентации
12.3 Замещение страниц оперативной памяти
0:10
Опечатки:
Вместо "Замещением страниц оперативной памяти освобождение памяти)"
должно быть "Замещением страниц оперативной памяти (освобождением памяти)"
Эти же опечатки есть в презентации.
12.4 Системные средства манипулирования оперативной памятью
4:04
Опечатка - пропущен первый символ. Вместо СВ
unmap()
должен быть СВ
munmap()
4:30 и далее
В лекции неоднократно СВ shmget() называется как СВ msgget, который используется для совершенно иной цели — для открытия для доступа и создания (при необходимости) очереди сообщений. Хотя на слайдах имя СВ представлено правильно.
Не приведено описание аргумента
key – идентификатор участка памяти в системе (ключ для доступа к разделяемой памяти).
Как на экране, так и на слайдах.
Вероятно, неверно дано описание последнего аргумента:
"Аргумент shmflg используется для округления выделяемой памяти до границ страниц памяти."
В литературе оно описывается так:
1. Кейт Хэвиленд, Дайна Грэй, Бен Салама. Системное программирование в UNIX: Руководство программиста по разработке ПО, стр. 229
"параметр permflags задает права доступа к сегменту памяти и, кроме того, может содержать флаги IPC_CREAT и IPC_EXCL."
2. Н.В.Вдовикина, И.В.Машечкин, А.Н.Терехин, В.В.Тюляева. Программирование в ОС UNIX на языке Си, 2009, стр, 89
"Третий параметр определяет флаги, управляющие поведением вызова."
Эта ошибка есть и на слайдах.
Также неясно описано возаращаемое значение этого СВ. Вместо "Возвращает номер пользовательского дескриптора открытого файла в случае успеха, или – 1 в случае неудачи."
вероятно должно быть что-то вроде:
"Возвращает номер пользовательского дескриптора участка разделяемой памяти (сегмент памяти в ОС семейства Unix представляется также, как и открытый файл) в случае успеха, или -1 в случае неудачи."
Эта ошибка есть и на слайдах.
12.5 Системные средства манипулирования оперативной памятью (продолж.)
3:01
Опечатки. Вместо
"Task"
должно быть
"Tasks"
Вместо
"Load avarage"
должно быть
"Load average"
Эти же опечатки есть в презентации.
3:41
Странная формулировка. Вместо
"ожидает родитель считает его статус выхода"
Лучше написать
"в ожидании чтения статуса своего завершения родительским процессом"
Эти же формулировка есть в презентации.
13.3 Перенаправление ввода-вывода. Конвейеризация
3:26
На слайде вместо "Перенаправление ввода" написано "Перенаправление вывода"
Эта же неточность есть в презентации.
13.4 Условная последовательность выполнения команд и Поддержка командного языка программирования
1:44-2:40
Говорится, что в условной последовательности выполнения команд
pwd || ls
обе команды выполняются в любом случае, результат аналогичен выполнению этих двух команд по очереди.
Здесь допущена ошибки, ведь символ "||" обеспечит выполнение следующей команды только в том случае, если предыдущая команда не выполнится (т.е. сгенерирует ненулевое значение кода завершения). Поэтому выполнится только команда pwd. Для того же, чтобы выполнить команды одну за другой в любом случае, между ними нужно добавить разделитель ";", в результате получится:
pwd ; ls
Эта же ошибка есть в презентации.
Для иллюстрации действия символа "||" больше подходит другой пример:
cd foo || echo "No such directory"
Здесь команда echo выполнится только в случае, если команда cd не смогла перейти в директорию foo.
13.5 Встроенные и внешние команды интерпретатора shell
3:15
Опечатка. Вместо
exac
должно быть
exec
Эта же неточность есть в презентации.
14.2 Вычисление арифметических выражений в shell
1:01
В выражении
b=`expr $a/3`
пропущены пробелы:
b=`expr $a / 3`
Подобные ошибки есть почти во всех примерах.
Эта же неточность есть в презентации.
14.3 Вычисление арифметических выражений в shell (продолжение)
1:24
Аналогично, во всех трех выражениях пропущены пробелы до и после двоеточия:
вместо:
y=`expr "$x":'abc'`
z=`expr "$x":'abd'`
w=`expr $x:".*"`
echo $y $z $w
должно быть:
x=abcde
y=`expr "$x" : 'abc'`
z=`expr "$x" : 'abd'`
w=`expr $x : ".*"`
Подобные ошибки есть почти во всех примерах.
Эта же неточность есть в презентации.
15.6 Примеры реализаций shell-скриптов
15:43-16:12
Пример 3 (1-ый вариант)
Опечатка в окончании последнего слова предложения
"количество файлов текущего каталога, содержащих текстовую информации"
должно быть
"количество файлов текущего каталога, содержащих текстовую информацию"
Эта же опечатка есть в презентации.
15.7 Примеры реализаций shell-скриптов. (Продолжение)
8:12
Показана только часть строки с отсутствующим закрывающим символом `(«тупое» ударение). Вместо
files=`file *
должно быть
files=`file *`
10:21
Аналогично, только часть строки без закрывающего символа `. Вместо
n=`du -b $i
должно быть
n=`du -b $i`
16.2 Пример 1. Реализация многозадачного приложения с обработкой сигналов
Опечатка в коде обработчика. Вместо
if [ flag –eq 0 ]
должно быть
if [ $flag –eq 0 ]
Эта же опечатка есть в презентации.
16.4 Пример 2. Продолжение
Пример 2. Окончательная реализация + Пример 2. Полный программный код
4:46-5:28
Перед строкой "Некорректные права доступа" пропущена команда echo. Вместо
"Некорректные права доступа"
дожно быть
echo "Некорректные права доступа"
Эта же опечатка есть в презентации.