Documentation
¶
Overview ¶
Package execstub — исполняемый двойник, которого проба пишет и тут же запускает.
Почему не `os.WriteFile(…, 0o700)` ¶
Ядро отвечает на запуск файла ETXTBSY («Text file busy»), пока у его inode есть открытый дескриптор записи — в любом процессе. Проба закрывает свой дескриптор до запуска, но соседняя параллельная проба того же процесса может успеть сделать `fork` в окне между открытием и закрытием: ребёнок наследует копию дескриптора и держит её до своего `exec` (O_CLOEXEC закрывает её лишь там). Запуск двойника в этот промежуток и падает ETXTBSY — отказ пробы, которого её предмет не вызывал (kaname#893: `bad interpreter: Text file busy` у двойника `gh` в TestImageProducerTagsALineHeadLikeTheTrunk).
Переименование временного файла само по себе не спасает: ETXTBSY — свойство inode, а не имени, и переименованный файл — тот же inode. Спасает `syscall.ForkLock`: `fork` в Go берёт его на запись, поэтому окно записи под блокировкой на чтение не застаёт ни одного порождения. Временный файл с переименованием добавляет второе: двойник по итоговому имени появляется только целиком.
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
Types ¶
This section is empty.