2015-09-08 3 views
1

В основном я использовал strace, чтобы узнать, почему процессы, казалось, повесились, и это было очень эффективно. Но теперь я использую его для анализа того, почему некоторая блокировка в программе c не работает. Когда я запускаю его в реальной проблемной программе, я вижу, что каждый процесс блокирует определенный файл с помощью fcntl с опцией, которая должна заставлять процессы позднего запуска ждать, пока предыдущий процесс не разблокируется. strace, похоже, показывает, что каждый процесс проходит, хотя замок уже на месте.strace «не в порядке»

Однако, я сделал свою собственную программу c для процессов fork 4, и если процесс является дочерним процессом, он блокирует /tmp/test.txt, добавляет несколько строк к нему и затем разблокирует файл. Затем я запускаю это с помощью strace, и я вижу результаты, которые в порядке, который я считал бы невозможным. Опять же, идя по strace, каждый процесс, кажется, проходит через блокировку fcntl, даже если другой процесс уже заблокирован. Кроме того, каждый процесс, как представляется, записывает в файл ПОСЛЕ того, что процесс выполнил разблокировку.

Существует, по-видимому, некоторый уровень сложности в том, как выполняется процесс, с которым мне трудно найти документацию. Может кто-нибудь помочь мне на правильном пути?

Кстати, я рассмотрел используемые команды fcntl, и они кажутся очень стандартным, и каждый параметр проверяет документацию. Я использую Centos 6.6.

ответ

0

На каком основании вы говорите

каждый процесс, кажется, проходит через замок FCNTL, даже если другой процесс уже ее запертым

Там нет опции в Трассировании для печати штампа времени в cpu, чтобы вы могли найти разницу во времени между двумя системными вызовами.

Например,

[PID 11778] 10: 38: 19,729429 < ... далее возобновлено> "", 4096) = 0

[PID 11783] 10: 38: 19,729443 записи (1, "\ 33 [? 1049h \ 33 [? 1h \ 33 = \ г", 16>

В приведенном выше вывод, метка времени это время, при котором Трассирование печатается на выходе, а не точным мгновенно, когда системный вызов завершен. Поэтому мы никогда не можем сказать, произошло ли первое событие раньше или позже в реальности, чем второе событие.

+0

Спасибо Nithan. Я проверяю время в strace. Старые мозговые цепи медленно просыпаются. – Scott