execl в отдельном потоке - убивает процесс (c ++ std 11)

0

учти это

#include <cstdio>
#include <iostream>
#include <fstream>
#include <sstream>
#include <cstdlib>
#include <vector>
#include <string>
#include <iterator>
#include <cmath>
#include <thread>
#include <cerrno>
#include <cstring>

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <getopt.h>

#include <boost/algorithm/string.hpp>

#include "utils.cpp"
#include "pstream.h" 
//pstream is the process stream library as below
void doThings()
{
while(not exitflag, a global){
if(some condition) {execl (a bash script); std:cout << "this text will never get printed, process ends at execl" <<endl;}
}}}

int main()
{//detach  doThings as a thread here

}

я могу гарантировать, что глобальный exitflag не установлен, также была бы напечатана строка std :: cout, даже если был установлен флаг, потому что нет команды для разрыва и перехода к концу while, чтобы поздравить окончание до печать сообщения.

что я сделал не так? BTW: сценарий оболочки работает отлично.

редактирование: (спасибо minitech) Я не хотел, чтобы оригинальная программа умерла

pthreads: http://sourceforge.net/projects/pstreams/files/pstreams/Release%200.8.x/

  • 0
    Понятия не имею, что вы здесь спрашиваете. Не могли бы вы показать, какой результат вы получаете и что вы ожидаете вместо этого?
Теги:
multithreading
exec

1 ответ

4
Лучший ответ

Из документации execl

Семейство функций exec() заменяет текущий образ процесса новым образцом процесса. Функции, описанные на этой странице руководства, являются интерфейсами для execve (2). (Более подробную информацию о замене текущего образа процесса см. на странице руководства для execve (2).)

Вы всегда должны вызывать fork перед вызовом execl если вы не хотите, чтобы исходная программа умерла.

  • 2
    Не всегда, но почти всегда. Причины отказа от вызова fork() вначале обычно бывают странными, например, программа-обертка SUID, которая должна что-то скорректировать в среде процесса перед запуском другой программы (хотя обычно она использует execv() или execve() а не обычно execvp() - поскольку он, вероятно, будет передавать аргументы пользователя в исполняемую программу. Однако, в первом приближении, подойдет 'Always'. И вы абсолютно правы, что exec*() завершает все потоки в процессе.
  • 0
    Только что отредактировал ответ, спасибо за звонок для пробуждения :)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню