В GNU / Linux можно перехватывать все системные вызовы программы и ее дочерних элементов, используя ptrace(2)
. Типичное программное обеспечение будет полагаться исключительно на системные вызовы для взаимодействия с другим программным обеспечением.
Каковы возможные источники недетерминизма, которые может использовать программа, которые не связаны с системными вызовами? И они обычно используются?
Как правило, если бы я хотел разработать универсальный механизм кэширования , который отслеживает все системные вызовы программы и ее подпроцессов, и я должен был просто воспроизвести их, проверяя, что эти вызовы возвращают точное тот же результат (если нет, я вернусь к фактическому запуску программы), будет ли это всегда вести себя как настоящая программа?
С практической точки зрения, если я ослаблю некоторые вызовы, чтобы учесть другое поведение (обычно brk
и mmap
имеют тенденцию выбирать разные адреса и getpid
возвращают разные идентификаторы процесса, но они на самом деле не влияют на программу много поведения) есть ли обычно используемые программы, которые бы нарушали эти ожидания? (обычно я предполагаю, что инструменты сборки имеют тенденцию быть довольно детерминированными)
Существует ли такая реализация универсального механизма кэширования ?