учти это
#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/
Семейство функций exec() заменяет текущий образ процесса новым образцом процесса. Функции, описанные на этой странице руководства, являются интерфейсами для execve (2). (Более подробную информацию о замене текущего образа процесса см. на странице руководства для execve (2).)
Вы всегда должны вызывать fork
перед вызовом execl
если вы не хотите, чтобы исходная программа умерла.
fork()
вначале обычно бывают странными, например, программа-обертка SUID, которая должна что-то скорректировать в среде процесса перед запуском другой программы (хотя обычно она использует execv()
или execve()
а не обычно execvp()
- поскольку он, вероятно, будет передавать аргументы пользователя в исполняемую программу. Однако, в первом приближении, подойдет 'Always'. И вы абсолютно правы, что exec*()
завершает все потоки в процессе.