Стоит заметить, что оболочка должна установить перенаправления перед запуском программы.
Рассмотрим ваш пример:
./write_file.py >> ~root/log
В оболочке происходит следующее:
fork ()
; дочерний процесс наследует дескрипторы открытых файлов от своего родителя (оболочки). fopen ()
(расширение) «~ root / log» и dup2 ()
его до fd 1 (и закрываем ()
временный fd). В случае сбоя fopen ()
вызовите exit ()
, чтобы сообщить об ошибке родителю. exec ()
"./write_file.py". В этом процессе больше не выполняется какой-либо из наших кодов (если мы не смогли выполнить, и в этом случае мы exit ()
, чтобы сообщить об ошибке родителю). wait ()
для завершения дочернего процесса и обработает его код выхода (копируя его, по крайней мере, в $?
). Таким образом, перенаправление должно происходить в дочернем элементе между fork ()
и exec ()
: этого не может произойти до fork ()
, потому что это не должен изменять стандартный вывод оболочки, и это не может произойти после exec ()
, потому что имя файла и исполняемый код оболочки теперь заменены программой Python. Родитель не имеет доступа к файловым дескрипторам дочернего элемента (и даже если бы он был, он не мог гарантировать перенаправление между exec ()
и первой записью в stdout).
lsusb
может попытаться открыть USB-устройство в режимеO_RDWR
(чтения/записи )и у вашего пользователя может не быть прав на это (какое-то сообщение об ошибке «Не удалось открыть устройство, некоторая информация будет отсутствовать" должно быть между выводом, если это так ). Запущенный с правами root lsusb
также должен иметь возможность выводить все значение iSerial.
В целом существует множество различных USB-устройств (клавиатура, мышь, веб-камера,... ). lsusb
относится к подключенным устройствам на уровне протокола USB.
Некоторые USB-устройства являются устройствами хранения (USB-накопители, жесткие диски USB,... ). Они понимают другой протокол (более или менее SCSI )поверх протокола USB. В рамках этого протокола запоминающее устройство USB имеет серийный номер (, как и устройство ATA ). Это то, что вы видите в /proc/scsi/usb-storage
.
Число iSerial
, которое вы видите в lsusb
, не имеет к этому никакого отношения.
Вот почему вы видите интересующий вас серийный номер одним методом, но не видите другим методом. Вот почему вы не можете использовать lsusb
для получения интересующего вас серийного номера