LINUX.ORG.RU

почему если парент в некотором сисколе непосредственно перед vfork() лочит rwsem то зависает вместе спотомком если не снимет блокировку раньше чем её попытается захватить потомок?


0

0

парент лочит на запись, потомок пытается захватить на чтение

★★★★★

а почему он не должен виснуть-то? так и должно быть.
семафор взят на запись, down_read() будет спать.

idle ★★★★★
()
Ответ на: комментарий от idle

я ожидал что будет виснуть только потомок в ожидании когда парент сделает up_write() но виснут ВДВОЁМ

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

ничего не пойму,

> будет виснуть только потомок в ожидании когда парент
> сделает up_write()

так ведь parent ждет завершения потомка! deadlock классический.

idle ★★★★★
()
Ответ на: комментарий от idle

>так ведь parent ждет завершения потомка! deadlock классический.

хм. с какой стати? насколько я понимаю парент ждёт exec() или exit() в потомке.

кстати возможны ли какието сисколы в потомке между выходом из vfork() и вызовом exec/exit ?

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

> насколько я понимаю парент ждёт exec() или exit() в потомке.

ну так а я о чем???

> кстати возможны ли какието сисколы в потомке между выходом
> из vfork() и вызовом exec/exit ?

да любые.

idle ★★★★★
()
Ответ на: комментарий от idle

>> насколько я понимаю парент ждёт exec() или exit() в потомке.

>ну так а я о чем???

хм.

>> кстати возможны ли какието сисколы в потомке между выходом

>> из vfork() и вызовом exec/exit ?

>да любые.

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

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

> хм.

так я не понял, вы поняли в чем дело или нет?

> ибо их поведение на многих системах непредсказуемы

не знаю о каких системах идет речь. но это просто означает,
что на этих системах vfork() реализован ошибочно, вот и все.

> покрайней мере так часто рекомендуют

а вот рекомендуют правильно. ваша проблема тому лишнее
доказательство.

idle ★★★★★
()
Ответ на: комментарий от idle

почти понял

кстати тотальная замена vfork на fork() на уровне ядра(например в таблице системных вызовов) может дать какието побочные еффекты??

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

> кстати тотальная замена vfork на fork() ...
> может дать какието побочные еффекты??

что-то я вас плохо сегодня понимаю.

сами-то как думаете? ну могут поломаться приложения
которые делают vfork(), это побочный эффект или нет?

idle ★★★★★
()
Ответ на: комментарий от idle

>что-то я вас плохо сегодня понимаю.

ничё, отвечаете всегда в попад

>сами-то как думаете?

предполагаю что всё дожно работать, ибо на некоторых операционках где такое по дефолту как-будто траблов нету.

>ну могут поломаться приложения которые делают vfork(), это побочный эффект или нет?

эффект то побочный но я не могу предоставить ситуацию в которой он может возникнуть

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

> предполагаю что всё дожно работать

ну как может все работать, если vfork() скорее
похож на pthread_create() чем на fork() ???

поймите, он гарантирует несколько вещей, в том
числе и одну vm на двоих.

> ибо на некоторых операционках где такое по дефолту

ну какой смысл о них говорить? с моей точки зрения
_единственная_ правильная неполная реализация vfork()
это:

asmlinkage int sys_vfork(struct pt_regs regs)
{
        return -ENOSYS;
}

idle ★★★★★
()
Ответ на: комментарий от idle

вобщем заменил sys_vfork на sys_fork и всё поехало. на грабли пока не наступил. единственным приложением пользующим vfork пока - что был gcc

спасибо за помощь. мож чё лучше придумаю

cvv ★★★★★
() автор топика

vfork() был написал для оптимизации наиболее обычного случая (80%), когда потомок сразу же после vfork вызывает exec. Это уменьшает количество копируемых страниц памяти, но в описанном случае просто не подходит (это не средство создания потоков!).

Spectrum
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.