Что происходит во время выполнения ioctl/syscall в потоке, когда другой поток разветвляется?

Я читал, что многое может произойти при смешивании потоков и разветвлении, и этого лучше избегать. Я нахожусь в ситуации, когда у меня нет выбора, и я получаю сбои ядра моего модуля ядра.

В моем уменьшенном тестовом примере 2 потока. Одним из них является выполнение ioctl для открытого узла устройства в цикле. Другой делает одну вилку, ждет выхода ребенка, что он делает немедленно. Если я использую pthread_atfork чтобы синхронизировать мой поток с вызовом fork это работает.

Где я могу посмотреть, чтобы узнать больше о том, что происходит во время разветвления открытых файловых дескрипторов, которые в настоящее время выполняют ioctl? Какая коррупция может случиться?

РЕДАКТИРОВАТЬ: Андреас заставил меня изменить мой тестовый случай. Вместо немедленного выхода ребенка я не жду 10 секунд, прежде чем выйти. Я собираю все PID в родительском процессе, чтобы позже сделать waitpid. Я разветвляюсь 100 раз. Если происходит сбой после 2 или 3 разветвлений.

1 ответ

В этом отношении не должно быть проблем, вызванных многопоточностью. Особенно не должно быть сбоев ядра.

Из вашего описания звучит так, будто вы пишете свой собственный модуль ядра, который обрабатывает дескриптор файла, о котором идет речь. Обратите внимание, что разветвленный процесс получает копии всех открытых файловых дескрипторов. Когда он выходит, он закрывает их.

Неважно, что он, по-видимому, ничего не делает, кроме выхода немедленно, закрытие (и сброс в file_operations) происходит всегда. Вот где вы должны искать код своего ядра.

Другие вопросы по тегам