Что происходит во время выполнения ioctl/syscall в потоке, когда другой поток разветвляется?
Я читал, что многое может произойти при смешивании потоков и разветвлении, и этого лучше избегать. Я нахожусь в ситуации, когда у меня нет выбора, и я получаю сбои ядра моего модуля ядра.
В моем уменьшенном тестовом примере 2 потока. Одним из них является выполнение ioctl для открытого узла устройства в цикле. Другой делает одну вилку, ждет выхода ребенка, что он делает немедленно. Если я использую pthread_atfork
чтобы синхронизировать мой поток с вызовом fork это работает.
Где я могу посмотреть, чтобы узнать больше о том, что происходит во время разветвления открытых файловых дескрипторов, которые в настоящее время выполняют ioctl
? Какая коррупция может случиться?
РЕДАКТИРОВАТЬ: Андреас заставил меня изменить мой тестовый случай. Вместо немедленного выхода ребенка я не жду 10 секунд, прежде чем выйти. Я собираю все PID в родительском процессе, чтобы позже сделать waitpid. Я разветвляюсь 100 раз. Если происходит сбой после 2 или 3 разветвлений.
1 ответ
В этом отношении не должно быть проблем, вызванных многопоточностью. Особенно не должно быть сбоев ядра.
Из вашего описания звучит так, будто вы пишете свой собственный модуль ядра, который обрабатывает дескриптор файла, о котором идет речь. Обратите внимание, что разветвленный процесс получает копии всех открытых файловых дескрипторов. Когда он выходит, он закрывает их.
Неважно, что он, по-видимому, ничего не делает, кроме выхода немедленно, закрытие (и сброс в file_operations) происходит всегда. Вот где вы должны искать код своего ядра.