Я ищу функцию, аналогичную CreateProcess, но в Linux. Я провел много исследований и нашел подход "Fork off and die", который использует двойную вилку для запуска дочернего элемента под init. То есть, разрешить ребенку работать независимо от родителя.Создайте независимый процесс в Linux
Поскольку родительский объект должен возвращать информацию о вновь создаваемом дочернем процессе (то есть pid, имя и т. Д.), Мне нужно знать, запущен ли я в состоянии гонки в моем коде. В настоящее время я форк и извлекаю второй вилочный вил через трубы, а затем дождался выхода первой вилки.
int child = 0;
int fd[2] = { 0, 0 };
if (pipe (fd) != 0)
return Process();
int pid = fork();
if (pid < 0)
return Process();
if (pid == 0) // Child
{
if (setsid() != -1)
{
child = fork();
if (child == 0)
{
umask (0); // Reset umask
close (0); // Close stdin
close (1); // Close stdout
close (2); // Close stderr
execvp (...);
_exit (0);
}
// Do I need waitpid (child) here?
}
// Write the child PID using the pipe
write (fd[1], &child, sizeof (child));
_exit (0);
}
else // Parent
{
// Read the child PID using the pipe
read (fd[0], &child, sizeof (child));
// Remove zombie process
waitpid (pid, nullptr, 0);
// Child must finish exec by this point
return Process (child);
// Also gets name
}
Вопросы:
- Мне нужен второй waitpid ждать ребенка, чтобы закончить ехес ли?
- Ожидается ли waitpid при вызове exec?
- Ожидается ли возврат в ожидании, даже если exit или exec были вызваны до waitpid?
Почему вы хотите удвоить? Двойное форкирование выполняется, когда новый процесс не должен быть ребенком исходного процесса, совершенно противоположным тому, что вы хотите сделать. – fuz
Это именно то, что я хочу сделать. Я хочу создать процесс, который не имеет ничего общего с родительским процессом. Таким образом, даже когда родитель умирает, ребенок продолжает. Я возвращаю PID ребенка, чтобы я мог отлаживать его позже, если захочу. Это то, что делает функция CreateProcess для Windows, и мне нужно реплицировать ее на Linux. – Dave
В подходе с двойным форсированием новый процесс - это * не * дочерний элемент исходного процесса. Вы не можете есть торт и съесть его, если вы не взломаете что-то ужасно. – fuz