Вы можете использовать фабричную функцию Job(parent: Job?)
, которая получает родительское задание в качестве параметра. Он имеет следующее определение:
public fun Job(parent: Job? = null): Job
, что означает, что параметр parent является необязательным. Таким образом, вы можете создать свою работу следующим образом:
var parentJob: Job = Job()
var childJob: Job = Job(parentJob)
Также взгляните на SupervisorJob
, который можно использовать для настройки поведения по умолчанию Job
. SupervisorJob
Фабричная функция имеет аналогичное определение:
fun SupervisorJob(parent: Job? = null): Job
Один из вариантов - использовать strace:
strace -o logfile -eopen yourapp
Это будет регистрировать все открытые файлы событий, но это может привести к значительному снижению производительности. Однако его преимущество заключается в простоте использования.
Другой вариант - использовать LD_PRELOAD. Это соответствует вашему варианту №2. Основная идея состоит в том, чтобы сделать что-то вроде этого:
#define _GNU_SOURCE
#include <stdio.h>
#include <dlfcn.h>
int open(const char *fn, int flags) {
static int (*real_open)(const char *fn, int flags);
if (!real_open) {
real_open = dlsym(RTLD_NEXT, "open");
}
fprintf(stderr, "opened file '%s'\n", fn);
return real_open(fn, flags);
}
Затем выполните сборку с помощью:
gcc -fPIC -shared -ldl -o preload-example.so preload-example.c
И запустите вашу программу, например, с:
$ LD_PRELOAD=$PWD/preload-example.so cat /dev/null
opened file '/dev/null'
Это намного меньше накладных расходов.
Обратите внимание, однако, что есть другие точки входа для открытие файлов - например, fopen (), openat () или одна из многих устаревших точек входа совместимости:
00000000000747d0 g DF .text 000000000000071c GLIBC_2.2.5 _IO_file_fopen
0000000000068850 g DF .text 000000000000000a GLIBC_2.2.5 fopen
000000000006fe60 g DF .text 00000000000000e2 GLIBC_2.4 open_wmemstream
00000000001209c0 w DF .text 00000000000000ec GLIBC_2.2.5 posix_openpt
0000000000069e50 g DF .text 00000000000003fb GLIBC_2.2.5 _IO_proc_open
00000000000dcf70 g DF .text 0000000000000021 GLIBC_2.7 __open64_2
0000000000068a10 g DF .text 00000000000000f5 GLIBC_2.2.5 fopencookie
000000000006a250 g DF .text 000000000000009b GLIBC_2.2.5 popen
00000000000d7b10 w DF .text 0000000000000080 GLIBC_2.2.5 __open64
0000000000068850 g DF .text 000000000000000a GLIBC_2.2.5 _IO_fopen
00000000000d7e70 w DF .text 0000000000000020 GLIBC_2.7 __openat64_2
00000000000e1ef0 g DF .text 000000000000005b GLIBC_2.2.5 openlog
00000000000d7b10 w DF .text 0000000000000080 GLIBC_2.2.5 open64
0000000000370c10 g DO .bss 0000000000000008 GLIBC_PRIVATE _dl_open_hook
0000000000031680 g DF .text 0000000000000240 GLIBC_2.2.5 catopen
000000000006a250 g DF .text 000000000000009b GLIBC_2.2.5 _IO_popen
0000000000071af0 g DF .text 000000000000026a GLIBC_2.2.5 freopen64
00000000000723a0 g DF .text 0000000000000183 GLIBC_2.2.5 fmemopen
00000000000a44f0 w DF .text 0000000000000088 GLIBC_2.4 fdopendir
00000000000d7e70 g DF .text 0000000000000020 GLIBC_2.7 __openat_2
00000000000a3d00 w DF .text 0000000000000095 GLIBC_2.2.5 opendir
00000000000dcf40 g DF .text 0000000000000021 GLIBC_2.7 __open_2
00000000000d7b10 w DF .text 0000000000000080 GLIBC_2.2.5 __open
0000000000074370 g DF .text 00000000000000d7 GLIBC_2.2.5 _IO_file_open
0000000000070b40 g DF .text 00000000000000d2 GLIBC_2.2.5 open_memstream
0000000000070450 g DF .text 0000000000000272 GLIBC_2.2.5 freopen
00000000000318c0 g DF .text 00000000000008c4 GLIBC_PRIVATE __open_catalog
00000000000d7b10 w DF .text 0000000000000080 GLIBC_2.2.5 open
0000000000067e80 g DF .text 0000000000000332 GLIBC_2.2.5 fdopen
000000000001e9b0 g DF .text 00000000000003f5 GLIBC_2.2.5 iconv_open
00000000000daca0 g DF .text 000000000000067b GLIBC_2.2.5 fts_open
00000000000d7d60 w DF .text 0000000000000109 GLIBC_2.4 openat
0000000000068850 w DF .text 000000000000000a GLIBC_2.2.5 fopen64
00000000000d7d60 w DF .text 0000000000000109 GLIBC_2.4 openat64
00000000000d6490 g DF .text 00000000000000b6 GLIBC_2.2.5 posix_spawn_file_actions_addopen
0000000000121b80 g DF .text 000000000000008a GLIBC_PRIVATE __libc_dlopen_mode
0000000000067e80 g DF .text 0000000000000332 GLIBC_2.2.5 _IO_fdopen
Вам может потребоваться перехватить все эти файлы для полноты - по крайней мере, те, которые не имеют префикса _, должны быть зацепил. В частности, обязательно подключите fopen отдельно , так как внутренний вызов libc от fopen () к open () не обрабатывается библиотекой LD_PRELOAD.
Аналогичное предостережение применимо и к strace - есть также системный вызов openat, и в зависимости от вашей архитектуры может быть другие устаревшие системные вызовы. Но не так много, как с хуками LD_PRELOAD, поэтому, если вы не возражаете против снижения производительности, это может быть более простой вариант.
Я использую что-то вроде:
strace -o file.txt ./command
Затем вы можете
cat file.txt | grep open
получить список всех файлов, открытых программой.
man strace
пример (предположим, что 2343 - это идентификатор процесса):
# logging part
strace -p 2343 -ff -o strace_log.txt
# displaying part
grep ^open strace_log.txt