170 похожих чатов

Я что-то не могу понять, как реализовать систему fork()-and-exec() exec() заменяет

текущий процесс, но как его запустить с новосозданного процесса?

21 ответов

21 просмотр

Строго говоря этого вопрос не по с++ а по линукс

В юниксах нельзя иметь новосозданные процессы. Там есть один первый процесс с PID=1, который называется init. Этот процесс внутри себя делает fork()+exec() всего остального.

Alexander B. Babayants
https://docs.oracle.com/cd/E88353_01/html/E37841/s...

Первая ссылка в гугле: https://pastebin.com/e8fwB0kW

Гласси
Первая ссылка в гугле: https://pastebin.com/e8fwB0...

я не знаю что эта ссылка должна сказать, я вам привел конкретный сисколл конкретного юникса, создающий новый процесс без fork/exec

видимо, то что на Linux posix_spawn можно сделать через vfork+exec? ну ок, а на Solaris нельзя

Alexander B. Babayants
видимо, то что на Linux posix_spawn можно сделать ...

На сайте оракла написано, что posix_spawn() в Solaris тоже vfork() использует.

Гласси
На сайте оракла написано, что posix_spawn() в Sola...

Раньше использовал vfork: https://blogs.oracle.com/solaris/post/posix_spawn-as-an-actual-system-call > ну ок, а на Solaris нельзя здесь I stand corrected: можно, но уже не нужно) в общем противоречия с первоначальным тезисом "как минимум в одном юниксе есть сисколл чтобы создать процесс без форка" не вижу

Alexander B. Babayants
Раньше использовал vfork: https://blogs.oracle.com...

Я говорю, в юниксах все процессы (кроме первого) делаются через форк, а вы мне какое-то непорочное зачатие.

Гласси
Я говорю, в юниксах все процессы (кроме первого) д...

Не вижу смысла продолжать дискуссию, если в словах "в Solaris можно создать процесс не через fork + exec, а через spawn" все еще есть что-то непонятное

Слово "обертка" вам знакомо? https://github.com/kofemann/opensolaris/blob/80192cd83bf665e708269dae856f9145f7190f74/usr/src/lib/libc/port/threads/spawn.c#L302

Гласси
Слово "обертка" вам знакомо? https://github.com/k...

Почему вы приводите posix_spawn как аргумент? В первой же ссылке, которую скидывали, было написано, что это posix_spawn реализуется через spawn, а не наоборот + у оркала исходники закрыты, а вы ссылаетесь на попытки повторить

Гласси
Слово "обертка" вам знакомо? https://github.com/k...

Вы приводите исходники 15-летней давности как аргумент что в Solaris 11.4, вышедший в 2018, posix_spawn работает не через отдельный сисколл?

# include <iostream> # include <unistd.h> # include <sys/wait.h> # include <sys/types.h> # include <stdio.h> int main(int A, const char* ptr[]) { //Get pid of main process pid_t PID = getpid(); // Make copy of main process pid_t new_PID = 0; new_PID = fork(); // Who is here? switch( new_PID ) { case -1: std::cerr << "Err" << '\n'; break; // This code for copy of main process case 0: std::cout << "Start new proccess" << '\n'; new_PID = getpid(); // Run new proccess instead of copy execl("Hel", " " ,NULL); std::cout << "End New process" << '\n'; // Not print sleep(10); return 1; break; default: { // This code for main process int Wt = 0; wait(&Wt); sleep(10); } } return 0; }

Sergey
# include <iostream> # include <unistd.h> # includ...

Не надо форкать лучше под s6 процесс запустить )

Дмитро-Цимбалюк Автор вопроса
Artur
Не надо форкать лучше под s6 процесс запустить )

Пояснительную бригаду s6 это система инициализации, что имеется в виду

Дмитро Цимбалюк
Пояснительную бригаду s6 это система инициализации...

Когда вы используете s6 или любую другую систему надзора за процессами, сам надзиратель заботится о запуске и управлении процессами (или службами), которые вы хотите запустить. Вам не нужно вручную вызывать fork() для процессов в вашем коде с целью их демонизации или отправки на задний план, так как надзиратель контролирует жизненный цикл служб. Определение службы: С s6 вы обычно определяете службу, создавая скрипт "run". Этот скрипт содержит команды для запуска вашей службы. Вам не нужно включать в этот скрипт никакой логики для вызова fork() или отправки процесса на задний план; вы просто запускаете его на переднем плане. Управление службой: Когда вы просите s6 запустить службу, он выполнит соответствующий скрипт "run", который запускает вашу службу. Затем s6 будет следить за этим процессом. Если процесс неожиданно завершится, s6 может перезапустить его в соответствии с вашей конфигурацией. Отправка на задний план: В традиционном программировании Unix, если вы хотели, чтобы процесс работал в фоновом режиме и выживал после закрытия терминала, вам пришлось бы "демонизировать" его, что включает в себя ряд шагов, включая вызов fork(). С надзирателями процессов, такими как s6, это не требуется. Сам надзиратель гарантирует, что служба работает в фоновом режиме и отсоединена от терминала. Логирование: s6 также предоставляет возможности логирования. Если ваша служба записывает логи в стандартный вывод или стандартную ошибку, s6 может захватить эти логи и управлять ими для вас. В сущности, используя s6 или подобные системы надзора, вы отделены от низкоуровневых деталей управления процессами, включая необходимость вручную вызывать fork() для процессов. Вместо этого вы сосредотачиваетесь на определении того, как работает ваша служба, и надзиратель заботится о всем остальном.

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта