текущий процесс, но как его запустить с новосозданного процесса?
Строго говоря этого вопрос не по с++ а по линукс
У меня под виндой)
В юниксах нельзя иметь новосозданные процессы. Там есть один первый процесс с PID=1, который называется init. Этот процесс внутри себя делает fork()+exec() всего остального.
https://docs.oracle.com/cd/E88353_01/html/E37841/spawn-2.html
Первая ссылка в гугле: https://pastebin.com/e8fwB0kW
я не знаю что эта ссылка должна сказать, я вам привел конкретный сисколл конкретного юникса, создающий новый процесс без fork/exec
видимо, то что на Linux posix_spawn можно сделать через vfork+exec? ну ок, а на Solaris нельзя
На сайте оракла написано, что posix_spawn() в Solaris тоже vfork() использует.
Раньше использовал vfork: https://blogs.oracle.com/solaris/post/posix_spawn-as-an-actual-system-call > ну ок, а на Solaris нельзя здесь I stand corrected: можно, но уже не нужно) в общем противоречия с первоначальным тезисом "как минимум в одном юниксе есть сисколл чтобы создать процесс без форка" не вижу
Я говорю, в юниксах все процессы (кроме первого) делаются через форк, а вы мне какое-то непорочное зачатие.
Не вижу смысла продолжать дискуссию, если в словах "в Solaris можно создать процесс не через fork + exec, а через spawn" все еще есть что-то непонятное
Слово "обертка" вам знакомо? https://github.com/kofemann/opensolaris/blob/80192cd83bf665e708269dae856f9145f7190f74/usr/src/lib/libc/port/threads/spawn.c#L302
Почему вы приводите posix_spawn как аргумент? В первой же ссылке, которую скидывали, было написано, что это posix_spawn реализуется через spawn, а не наоборот + у оркала исходники закрыты, а вы ссылаетесь на попытки повторить
Вы приводите исходники 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; }
Не надо форкать лучше под s6 процесс запустить )
Пояснительную бригаду s6 это система инициализации, что имеется в виду
Вопрос - ответ)
Когда вы используете s6 или любую другую систему надзора за процессами, сам надзиратель заботится о запуске и управлении процессами (или службами), которые вы хотите запустить. Вам не нужно вручную вызывать fork() для процессов в вашем коде с целью их демонизации или отправки на задний план, так как надзиратель контролирует жизненный цикл служб. Определение службы: С s6 вы обычно определяете службу, создавая скрипт "run". Этот скрипт содержит команды для запуска вашей службы. Вам не нужно включать в этот скрипт никакой логики для вызова fork() или отправки процесса на задний план; вы просто запускаете его на переднем плане. Управление службой: Когда вы просите s6 запустить службу, он выполнит соответствующий скрипт "run", который запускает вашу службу. Затем s6 будет следить за этим процессом. Если процесс неожиданно завершится, s6 может перезапустить его в соответствии с вашей конфигурацией. Отправка на задний план: В традиционном программировании Unix, если вы хотели, чтобы процесс работал в фоновом режиме и выживал после закрытия терминала, вам пришлось бы "демонизировать" его, что включает в себя ряд шагов, включая вызов fork(). С надзирателями процессов, такими как s6, это не требуется. Сам надзиратель гарантирует, что служба работает в фоновом режиме и отсоединена от терминала. Логирование: s6 также предоставляет возможности логирования. Если ваша служба записывает логи в стандартный вывод или стандартную ошибку, s6 может захватить эти логи и управлять ими для вас. В сущности, используя s6 или подобные системы надзора, вы отделены от низкоуровневых деталей управления процессами, включая необходимость вручную вызывать fork() для процессов. Вместо этого вы сосредотачиваетесь на определении того, как работает ваша служба, и надзиратель заботится о всем остальном.
это какой-то протосистемд?
Обсуждают сегодня