(Этот ответ делает большое, большое предположение, что это будет работать в Linux.)
Исходный код C lsof
, инструмент, который сообщает, какие программы в настоящее время имеют дескриптор открытого файла для определенного файла, свободно доступен . Тем не менее, просто чтобы предупредить вас, я не мог ничего понять. Есть ссылки на чтение памяти ядра, поэтому для меня это либо вуду, либо черная магия.
Тем не менее, ничто не мешает вам запускать lsof
через вашу собственную программу. Запуск сторонних программ из вашей собственной программы - это обычно то, чего вы стараетесь избегать по нескольким причинам, например, безопасность (если мошенник изменит вредоносную программу на lsof
, он будет работать с привилегиями вашей программы, что потенциально может привести к катастрофическому ( последствия), но, изучив исходный код lsof
, я пришел к выводу, что не существует общедоступного API для определения, какая программа открыла какой файл. Если вы не боитесь, что люди меняют программы в /usr/sbin
, вы можете подумать об этом.
int isOpen(const char* file)
{
char* command;
// BE AWARE THAT THIS WILL NOT WORK IF THE FILE NAME CONTAINS A DOUBLE QUOTE
// OR IF IT CAN SOMEHOW BE ALTERED THROUGH SHELL EXPANSION
// you should either try to fix it yourself, or use a function of the `exec`
// family that won't trigger shell expansion.
// It would be an EXTREMELY BAD idea to call `lsof` without an absolute path
// since it could result in another program being run. If this is not where
// `lsof` resides on your system, change it to the appropriate absolute path.
asprintf(&command, "/usr/sbin/lsof \"%s\"", file);
int result = system(command);
free(command);
return result;
}
Если вам также необходимо знать, в какой программе открыт ваш файл (предположительно cp
?), Вы можете использовать popen
, чтобы прочитать вывод lsof
аналогичным образом. popen
дескрипторы ведут себя как fopen
дескрипторы, поэтому все, что вам нужно сделать, это fread
их и посмотреть, сможете ли вы найти название вашей программы. На моей машине вывод lsof
выглядит следующим образом:
$ lsof document.pdf
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
SomeApp 873 felix txt REG 14,3 303260 5165763 document.pdf