Скрипт DTrace никогда не сообщает о системных вызовах записи

Я использую следующий скрипт DTrace, чтобы следить за чтением и записью системных вызовов bash:

syscall::write:entry,
syscall::read:entry
/execname == "bash"/
{

}

Он успешно сопоставляет 2 зонда, но независимо от того, что я печатаю, я вижу только прочитанные вызовы. О вызовах записи не сообщается. Я ожидал получить вызовы записи, когда оболочка вернется на экран.

Является ли сценарий неправильным, или у меня неправильные предположения о том, как работает bash?

Я работаю под OSX Mountain Lion


person cfischer    schedule 06.04.2013    source источник
comment
Видите ли вы их, если определяете их отдельно без запятой?   -  person Eimantas    schedule 06.04.2013


Ответы (1)


Попробуйте с подстановочным знаком после "написать". Это перечислит соответствующие зонды:

sudo dtrace -l -n 'syscall::write*:entry'

И это, вероятно, даст вам ожидаемый результат:

syscall::write*:entry,
syscall::read*:entry
/execname == "bash"/
{

}

Используемый вызов, вероятно, write_nocancel.

person Ken Thomases    schedule 06.04.2013
comment
Там не так много. У Apple есть примечание к выпуску под названием Варианты символов: почему эти знаки доллара? упоминает варианты символов с суффиксом $NOCANCEL. Это функции оболочки библиотеки, но системные вызовы, которые они оборачивают, на самом деле имеют суффикс _nocancel. Однако все, что о них говорится, используется внутри страны. Я считаю, что они связаны с отмена потока. - person Ken Thomases; 06.04.2013
comment
Спасибо! Я был поражен, что не смог найти почти ни одного упоминания в Google. - person cfischer; 07.04.2013