Я так і знав))
fork в лінухі задепрекейчений і рекомендують використовувати vforkщо тут можна двозначно зрозуміти — то загадка ... То або коректно, або ні)
байдуже конкретний вислів, трабли з форком існують, переступаємо через «пуризм», ігноруємо такі деталі...
fork в лінухі НЕ задепрекейчений, але все одно форк — г@авно (і на те є аргументи)
І так, для деяких кейсів vfork — краще... (а для деяких навіть fork прокатить, просто з міркувань простоти та ліні, вище маємо чудовий рецепт))
корисний аутпут є, скільки ми цікавих нюансів висвітлили...
й нагенерили україномовного контенту по темі, що, на моє сподівання, заіндексується гуглом і вестиме сюди, а не на «форум рускіх праграмістаф»
хіба ж це не прекрасно?
Все вірно, аплодую, саме так!
Але зараз хтось прийде й почне виясняти, що саме там мав а увазі автор процитованого посту і тому подібне...
Та байдуже на ті всі з’ясування, продуктом розмови повинна бути порада як діяти в конкретній ситуації, й ось цей допис вище: чадовий підсумок!
Забути можна назву Windows API чи параметри виклику, але не суть.
Та ні, не можна, така задачка взагалі для багатьох людей невирішувана...
ніколи не пам’ятаю порядок аргументів навіть для стандартного memcpy, бо, насправді, доволі рідко користуюся))
Глибокі знання — це розуміння, що відбувається і чому.
Але за розуміння концептій — так, лише в тому і є правдиві знання, і те що дійсно можливо запам’ятати (тому й кажу, всі мови програмування — насправді однакові, всі «високі» концепції типу інстроспекшенів/рефлекшенів, чи кложурів/ламбд — однакові... звісно що мови відрізніються зручністю використання концепцій, й не всюди це «притягується за вуха», але можливо))
_______
на співбесіді, як правило, ніхто не пам’ятає синтаксис ламбди в С++ й всі оті деталі про = та & і не треба...
якщо людина вловила концепцію находу, змогла написати функцію, що повертає «додаватор», отже «берем» (особливо якщо ще й робить висновки про те, які наслідки матиме для алокації пам’яті), а якщо «ніяк не доходить», тоді у відсів, й байдуже що там в резюме пише і які «погони»
його можна запромптити то все зробити, зокрема й непоганий прийом підготовки до презентації «розкритикуй мою позицію, знайди вади, враховуючи що моїми опонентами будуть завчені програмісти-задроти що й далі викладають в політесі й мають вивернутий хід мислення з менторськими замашками», можна навіть згадати рід занять кожного з них й теми дисертацій))
а от там, якраз без імітації деяких функцій інтелекту, пліз
Звичайно, спробуйте но в «блогерів» (і в «наших» і в «їхніх») з’ясувати при якій полярності (прямій, чи зворотній) більше плавиться деталь, а при якій електрод (втім й щодо того, яке підключення «пряме», а яке «зворотнє» теж нема згоди)...
Й то люди, які, нібито, «варять» й розповідають про «як треба зварювати», й, відповідно, мали б знати...
А виходить, що їхня «наука» — то само, що «лікування в екстрасенсів» — кожен бачить такі ефекти, які йому подобаються...
___
Звісно, моджна знайти скани ПТУшних книжок, які таки сходяться на одному,
але це, очевидно, лише до тих пір, поки «блогери» не почали видавати свої...
Іншими словами відтворюбваність знань вже губиться...
В політесі я ніколи не міг зрозуміти нафіга нас мучають тими тупими лабораторками на допотопній техніці (особливо в тому контексті що ми все одно списували/підтасовували дані), а насправді оригінальна задумка якраз й була в тому, щоб запезпечити оту відтворюваність...
Але ту задумку також вже було загублено, й «лабораторки» — «відбування»
Copilot дуже слабкий
головне, що він «брєдогенерить» правдоподібно, а решта потужніших мереж брєдогенерять ще більш правдоподібно...
треба вміти «заставити змію їсти свій хвіст», так щоб й автоматично перевіряти та валідувати все оте «правдоподібно набрєдогенероване» також за допомогою ШІ, а в пошуку справжніх багів він не надто сильний.
А насправді якщо побачив в коді глупості — запитай в ШІ, й він відповість такою ж дурнею
Спочатку в питанні про ЖС він розповідає про те, як воно працює в Пайтоні (замінивши Пайтон на ЖС й ліст на аррей):
«Іn JavaScript, when you use a default parameter with an array and modify it inside the function, that modification persists across multiple calls [БРЕХНЯ]. This happens because the default array is created once and reused in subsequent function calls.[БРЕХНЯ]»
тоді дає правильний приклад на ЖС як воно насправді робе й каже правду:
«This works as expected because a new array is created each time arr is missing.»
і тут мав би бути кінець генерації...
але ні, він тоді бореться з неіснуючою проблемою й вкінці таки видає ЖСний код який ЖСними методами боре Пайтонівську поведінку
___
Іншими словами LLM насмикала фрагментів з різних текcтів (то вона чудово вміє) й чудово юзає свої «особливості» щоб виявити «закономірності» яких насправді нема, й згенерувати «по аналогії» брехливий текст
звісно приклад дуже спрощено, щоб «не палити» NDA...
звісно результат можна виправити, якщо запитати в іншої моделі,
але ж рідна компанія «поблагословила» тільки одного «помічника» як валідного для генерації «під NDAшного коду»...
Така собі бомба сповільненої дії. Коли набереться критична вага згенерованого коду який ніхто не розуміє і не може підтримувати, що може призвести до колапсу для багатьох продуктів та компаній.
Коли ШІ почне вчитися на коді збрєдогенерованому самим ШІ))
саме так, саме так, деякі з них (не з найвищих «СЄО», а з «візіонерів» поменше) ще й почнуть за допомогою AI г@внокодити «от бачиш як просто! я тут за пів години в чаті ЖПТ нагенерував згідно свого віжена, а тепер ти повиправляй баги та заінтегруй»...
В першу чергу потрібен нормальний робот прибиральник, а не та кругла байда, що нічого не шарить і тільки розмазує по всій хаті котяче г@вно...
Робот посудомийник, щоб сам збирав тарілки й в посудомийку запихав...
Робот кухар (з всіма скілами від чищення картоплі й нарізання салатів до власне слідкування за процесом й подальшого розкладання по тарілках)...
Робот збиральник постілі і запихальник в пралку, разом з роботом застеляльником та запихальником одиял та подушок в наволочки і так далі...
Робот заміняч обіср@них памперсів та помивач і підтирач дитячих ср@к...
І так далі...
...Робот робильник з дітьми уроків, і пояснювальник шкільної програми про «голосні» та «приголосні» та про «підмети» і «присудки»...
А саме головне — робот вмовляльник та мотивувальник, щоб дитя їло здорову їжу а не «оте все», щоб робило уроки вчасно і тд...
Однім словом, щоб ті роботи робили в хаті все те, що колись робили в шляхетних панів в хаті їхні слуги, наймані вчителі/гувернантки і тд ...
В тому всьому найбільша сумулька, що ШІ «забирає» найцікавішу роботу «творення нового»...
Там де він намагається продовжити твій рядок, це ще прикольно, але там, де так звані «експерти» ним «брєдогенерять» цілі файли, «а тепер ти їх інтегруй», то — велика сумулька.
І «скільки не годуй» його вже готовим «бажним» кодом (згенерованим ним самим!), він там знаходить для «пакращення» все що завгодно, тільки ж не справжній руткоз, ще й гробиться додатковий час на перевірку його «гіпотез»...
(десь тут має бути лінк на картинку «робот художник малює/творить, а живий дядечко прибирає»...)
Звісно, що можна його нагодовувати промптами для генерації тестів, і навіть заставляти його аналізувати валідність своїх же тестів, але в якийсь момент цей «метапідхід до метапідходу» вже зовсім перестає працювати, й без чєловєків — ну ніяк...
колись вважалося «легкими завданнями», більше не існуватиме
правда, бо розгрібати та інтегрити набрєдогенероване ШІ набагато важче, ніж те, що наг@внокодили чєловєкі...
================
Але є і переваги — AI це якраз той працівник, що ніколи не образиться за скинуту на нього «нецікаву, обезьянську роботу» і не накатає скаргу за те, що його «весь час заставляють переробляти»... і це прекрасно))
тепер піднімаєтесь догори
та «там догори» питань більше нема
fork — сумулька (нехай й іншими словами))
syslog після форка — сумулька :)
і так «можна працювати в *nix і не знати про syslog()», запросто
і люди цілком собі працюють в своїх пайчармах, і ніякими syslog та системними джорналами не користуються, бо їм то наф*г непотрібно))
й в «ідеальному світі» *саме так би й мало б бути* :)
штовхайте далі, vfork goodness десь застрягла
«смєшалість в кучу коні, люді...»
vfork (та posix_spawn() куди ж без неї))
))
назвіть це superloop містера NobodyXu
ем, та ж навіть M$ про то само...
там ж на тому ж gist й лінки про репости
взагалі не розумію, що там неправда?
те, що цю частиниу не вписали в офіційних манах?...
так ті мануали також пише буквально «невідомо хто», але навіть згідно тих мануалів юзати syslog не можна після fork бо попри те, що syslog MT-Safe він все одно AS-Unsafe
додайте в с̶к̶р̶и̶ж̶а̶л̶і̶ gists вебпрограмування
ем, не розумію, а в чому проблема з вебпрограмуванням?
чому це вебпрограмери не мають права на свій прекрасний світ без траблів з зависанням логів після fork? ))
Та і для няшних Сшників та Сшниць про з@п@дло з нерозлоканими мютексами коли відбувається fork теж знати корисно :)
про те що повз системного syslog в ніксах пройти неможливо, та існування якого не мало б (від слова зовсім) викликати питання «знати про це».
Якого «системного», якщо корінь розмови — Пайтон, й те, на які АПІшки він опирається (або не опирається) в своєму малтіпроцесінгу))
І що ми тепер знаємо? Що юзати syslog не можна після fork бо хоч він й MT-Safe але AS-Unsafe))
що природньо викликало питання відносно юнікс мануалів.
нічого не знаю, мені байдуже, якщо я умовний «вебдевелопер», то хочу щоб все працювало з коробки згідно моїх «чайницьких вебдевелоперських» мануалів, а не «отого всього»))
Якщо весь мій «всесвіт» крутиться довкола умовного PyCharm, то «всьо решта» воно «в ідеальному світі» взагалі не повинно мене зачіпати... А на практиці «є нюанси», про які доводить «знати» не лише мені а й іншим доказувати «юзай set_start_method(’spawn’) бо ...»
І взагалі fork() is evil; vfork() is goodness; afork() would be better; clone() is stupid
І навіть M$ про те саме
))
Все решта — що де і як використовувати (включно з vfork python-multithread-fork syslog чи ще щось — це шукайте десь зверху — хто що де пропонував і дискутуйте що там spawn вирішено)
нічого незрозуміло, але дуже цікаво :)
p.s. це я як побачив «про що», інші по іншому, і т.д.
а мій інтерес цілком практичний — проблема існує, рішення знайдено, й навіть аргументів чому те рішення саме таке, а не інакше додатково прибуло :)
в інтернет /MT-Safe
і що?
«MT-Safe or Thread-Safe functions are safe to call in the presence of other threads. MT, in MT-Safe, stands for Multi Thread.»
взагалі не в тему
нас повинно зацікавити те, що вона «AS-Unsafe»... «AS-Safe, stands for Asynchronous Signal» (й згідно спеки, 100% не катить, бо «the child process may only execute async-signal-safe operations until such time as one of the exec functions is called»)
www.gnu.org/.../syslog_003b-vsyslog.html
manpages.debian.org/...ages-dev/syslog.3.en.html
де там про fork?
а я стверджував (і стверджую тепер 100% згідно лінків з постів вище, посилання на спеки), що коли парент пише syslog з багатьох срідів, й одночасно робить форк, то чайлд процесу може дістатися такий стейт, коли syslog в чайлді зависне й нічого не зможе записати...
syslog не катить
нічим не допоможу, і невпевнений чи там взагалі щось форкати можна, і як системні інтерфейси заюзані
Так воно ж форкає згідно доків
Та й ми ж тут коментуємо, взагалі то, пост про Пайтон та його
multiprocessing.Process(target=чототам...
(і multiprocessing.Lock це «не той» Lock, і не про те))
===================
про що ми сперечаємося?
чи можна юзати syslog в чайлді? ні не можна, див вище.
чи існують граблі з «відкопійованими з парента недорбленими стейтами» якщо багатосрідова аплікуха робить форк? так, існують!
Власне й в тому суть (знай би, де впадеш, то соломки б постелив :))
Зокрема й тут: юзаєш собі спокійно Пайтон згідно доків, «нікого не чіпаєш», а тут «така от проблемка», бо там на Лінухах під капотом fork з його сюрпрайзами!
Хочеш то пофікити — юзай set_start_method(’spawn’)
(або зовсім не юзай малтісрідінг в паренті, що не завжди можливо, адже його можуть юзати й ліби конкреного проекту, і то так просто не викинеш)
проблему вирішено :)
глянути в мануал що — syslog MT-safe, але не AS-safe
Ні, ні, нема такого в пайтонівських доках!
І в доках до syslog теж того нема
Це про мютекси й трабли знання яке «треба знати»
з чого я й почав «Який запис у лог?
Той лог, що локається окремим мютексом в парент процесі?...»
а далі вся наша дискусія довкола того, що syslog «не катить»,
й він таки не катить й не «бо напевно там можуть теж бути мютекси» а «точно, бо він не ліститься в списку дозволених АПІшок»))
log4... — по ідеї щось малоб бути в його доках який тип safety ви отримаєте з ним — але хз що там — не в курсі
В ідеальному світі «мало б бути», але чи є?
З точки зору «здорового глузду» ніякий логер для малтісрідінгової аплікухи не катить після fork («не катить», якщо ми його не створимо по новій, а поюзаємо з парента), бо там неодмінно будуть якісь локи...
так так і threading::ScopedLock lock поганяє threading::ScopedLock lock-ом... й так і кортить після форка поюзти щось готовеньке, що «і так видно» з нашого скоупа з «копії», а те «щось», воно (в загальному випадку) є «в якому завгодно стейті», зокрема й всередині операції, яка відбувалася в паренті в іншому сріді, й була «недороблена» поки ми робили fork, й тепер ми вже з копії хочемо до тої ж «недоробленої» штуки заломитися, щоб зробити «ще щось корисне» між frok та exec, або й після невдалого exec щось ще дологувати не в окремий лог, а в той, що «і так видно»...
тільки не лише з log4cpp, а й з канонічним та трушним syslog в загальному випадку теж нема певності чи не буде граблів саме з варіаннтом коли парент туди пише з багатьох срідів, а ми робимо fork...
тому опенлог для чайлда треба робити по новій, але це ж напевно попередній лог в тому чайлді треба закрити, нє? чайлд же скопіювався «з усім», в тому числі й з попереднім логом що був відкритим openlog ще в паренті, нє? а АПІшка закриття вона ж лізе в той мютекс, чи ні?
_____________
syslog, взагалі, точно не катить, бо
«A process shall be created with a single thread. If a multi-threaded process calls fork(), the new process shall contain a replica of the calling thread and its entire address space, possibly including the states of mutexes and other resources. Consequently, to avoid errors, the child process may only execute async-signal-safe operations until such time as one of the exec functions is called.»
і далі є список що то за async-signal-safe, які АПІшки дозволені
й там нема ніякого syslog, ні АПІшок його закривання/відкривання для того лога...))
тобто не можна юзати не лише «модні подєлки», а й канонічний syslog після fork... і навіть якщо з «няшної Сшки» згідно спеки!
Як до того всього повинен дійти «простий вебдевелопер»?
______________________
й такі ситуації, насправді, ніразу не весело, бо природні очікування для «простого смертного» що хоче просто та зручно поюзати
multiprocessing.Process(target=чототам...
вони зовсім не такі, без сподівання таких граблів для звичних операцій...
людина ж просто пише
def чототам():
і отут сподівається, ніби можна поюзати все оте,
що тут же в своєму ж модулі,
й що видно вище в цьому ж самому файлі!...
але не можна, якщо парент малтісрідовий та юзається fork,
бо воно «внутрях» все одно все покладається на ту ж Сшку, той же Posix та всі приколи про трушний fork вони аплікабл навіть якщо ти стильний, модний, молодьожний тру вебдевелопер!
Та ніхто (по більшості) не буде дивитися, скопіпейстять з
стековерфловаз чату GPT без ніякого розуміння...(мануал треба читати не одну сторіночку і дуже вдумчиво, щоб зрозуміти наслідки та зробити висновки... це «так просто не працює»)