В основном 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.
Обычно, 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", ...)