Да, есть. Общий механизм для этого типа вещей (, переопределяющий стандартную функцию ), называется LD _PRELOAD. Общая идея довольно проста: при загрузке библиотек в память для программы та из них, которая первой определяет данное имя символа, определяет, что делает этот символ. Таким образом, LD _PRELOAD позволяет указать динамическому компоновщику загружать определенные библиотеки перед всеми остальными (, включая libc ), что означает, что они могут переопределять определенные функции из библиотек, которые будут загружены позже.
Примеры широко используемых проектов, использующих LD _PRELOAD, включают:
sync()
и связанные с ними призывы ничего не делать, повышающие производительность некоторых приложений за счет безопасности данных. Существует также библиотека, которая делает именно то, о чем вы спрашиваете, под названием libtrash
. Официальную веб-страницу -можно найти здесь . Я не уверен, работает это или нет, так как я никогда не использовал его сам, но недавно был выпущен новый вариант, так что похоже, что автор, по крайней мере, все еще поддерживает его.
Когда вы набираете ls
в терминале, оболочка, работающая в этом терминале (, может быть, bash, zsh и т. д. )вызовет системный вызов, сообщающий ядру о необходимости разветвления его процесса. Затем он сообщает ядру заменить образ нового процесса на программу ls
с системным вызовом execve
. Это загрузит код программы ls
с диска в оперативную память.
Итак, если вы имеете в виду, какая программа запускает программу, то это оболочка.