поврежденная ошибка канала с popen и JS ffi

В основном i686 для Pentium Pro/II и позже, в то время как i386 покрывает 386 и 486 центральных процессоров также. Из http://forums.fedoraforum.org/showthread.php?t=198771:

я хочу знать это, каковы значение и различие между i386 и i686, указанным в конце каждого пакета..?

Скомпилированный для различных архитектур ЦП. i386 должен хорошо работать на чем-либо выше 386 процессоров. i686 для более новых процессоров Pentium (новым, я имею в виду PII и выше), но может также быть выполнен на более новом Intel Core 2 Duos, Athlon, и т.д.

Так i686 должен работать; в значительной степени что-либо более новое, чем Pentium Pro или Pentium II является i686.

3
01.05.2018, 02:55
1 ответ

Обычно, tr не должен мочь записать, что сообщение об ошибке, потому что оно должно было быть уничтожено сигналом SIGPIPE при попытке записать что-то после другого конца канала, было закрыто после завершения head.

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

Можно воспроизвести его путем выполнения:

sh -c 'trap "" PIPE; tr -dc "[:alpha:]" < /dev/urandom | head -c 8'

Можно подтвердить, что это - то, что происходит путем выполнения:

strace -fe signal sh your-program

(или эквивалент в Вашей системе, не используя Linux). Вы будете затем видеть что-то как:

rt_sigaction(SIGPIPE, {SIG_IGN, ~[RTMIN RT_1], SA_RESTORER, 0x37cfc324f0}, NULL, 8) = 0

или

signal(SIGPIPE, SIG_IGN)

сделанный в одном процессе перед тем же самым процессом или одним из его потомков выполняется /bin/sh это интерпретирует ту командную строку и запускается tr и head.

Если Вы делаете a strace -fe write, Вы будете видеть что-то как:

write(1, "AJiYTlFFjjVIzkhCAhccuZddwcydwIIw"..., 4096) = -1 EPIPE (Broken pipe)

write системный вызов перестал работать с ошибкой EPIPE вместо того, чтобы инициировать SIGPIPE.

В любом случае tr выйдет. При игнорировании SIGPIPE, из-за той ошибки (но это также инициировало сообщение об ошибке). Если не это выходит после получения SIGPIPE. Вы действительно хотите, чтобы это вышло, так как Вы не хотите это продолжающий чтение /dev/urandom после того, как те 8 байтов были read head.

Чтобы избежать, чтобы сообщение об ошибке, можно было восстановить обработчик по умолчанию для SIGPIPE с:

trap - PIPE

До вызова tr:

popen("trap - PIPE; { tr ... | head -c 8; } 2>&1", ...)
5
27.01.2020, 21:17

Теги

Похожие вопросы