Защо ucontext беше добавен и след това премахнат от POSIX?

Доколкото знам, ucontext предлага нещо по-добро от setjmp. Но той е остарял и сега е премахнат от спецификацията на POSIX. И така, защо се появи и защо беше премахнат?


person eonil    schedule 22.02.2013    source източник


Отговори (1)


Подписът на makecontext от ucontext.h е:

void makecontext(ucontext_t *ucp, void (*func)(),
       int argc, ...);

Имайте предвид, че func използва празна скоба като аргумент, но това е отхвърлена функция в стандартния C:

C11(ISO/IEC 9899:201x) §6.11.6 Функционални декларатори

Използването на функционални декларатори с празни скоби (не декларатори на тип параметри във формат на прототип) е остаряла функция.

Това е причината да е отхвърлен (и някак си жалко).

person Yu Hao    schedule 26.12.2013
comment
Обосновката в свързаното описание на makecontext() от стандарта POSIX 2004 обяснява защо кодът е проблематичен. Той също така описва най-общо какви са алтернативите — използване на нишки. И посочва, че много малко програми са използвали съоръжението. - person Jonathan Leffler; 26.12.2013
comment
@JonathanLeffler Намерих обосновката на POSIX 2004 страница 743. Причината, която дава, е в общи линии същата като това, което казах, и дава малко по-подробно обяснение. Добавяне на неговата връзка тук, за да може OP да провери. - person Yu Hao; 26.12.2013
comment
@JonathanLeffler От книгата, Днес има много малко приложения, които използват рутинните процедури *context(). Тези, които ги използват, почти винаги ги използват за прилагане на съвместни процедури.. Може би това вече не е вярно. Хората се борят да върнат олекотени съпрограми в системното програмиране (напр. Go, Rust). И за съжаление, не можах да намеря доказателства, че нишката на POSIX може да осигури леки съпрограмми... - person eonil; 26.12.2013
comment
Интерфейсът е маркиран като остарял от почти десетилетие. Хората, които са избрали да го използват през това десетилетие, не са ужасно разумни (защото е маркирано като остаряло, така че ще изчезне с времето). Що се отнася до алтернативите, нямам мнение. Просто повторих това, което каза обосновката на POSIX. Той също така отбеляза, че съоръженията, използващи нишки, не са прости. Но те също така останаха с интерфейс, който не можеше да бъде внедрен в C99, така че избраха да го маркират като остарял. Коментарът ми имаше за цел да допълни отговора; правилната връзка с информация в далечния й край. - person Jonathan Leffler; 26.12.2013
comment
Ако някой иска да използва ucontext, най-вероятната причина е, че не иска да използва нишки за конкретно приложение на първо място. Като да имате нишка за всяка клиентска връзка, която може да има 1000. Всеки, който казва вместо това просто да използва нишки, е невеж. - person Hugo Maxwell; 03.10.2016
comment
@HugoMaxwell Бинго. Контекстите позволяват да имате планиране в потребителски режим. Те също така позволяват истински съпрограми в C, които могат да бъдат много полезни с определени API. - person Demi; 22.08.2018