Skip to content

Instantly share code, notes, and snippets.

@mezzatto
Created October 3, 2012 14:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mezzatto/3827099 to your computer and use it in GitHub Desktop.
Save mezzatto/3827099 to your computer and use it in GitHub Desktop.
/*!
* Cria um processo
* \param name nome que sera dado ao novo processo
* \param path caminho do executavel do processo
* \param parametro parametros a serem passados para o executavel do processo
* \param priority prioridade do processo (ou 0 para prioridade padrao)
* \return 0 sucesso, processo criado
* \return 1 erro, processo nao criado
*/
int BPMonitorProcessRestart(char* const name, char* const path, char* const parametros, const int priority)
{
const pid_t pid = vfork();
// processo pai ou erro
if(pid)
{
if(pid < 0)
{
BPMonitorLogaErrno("vfork");
return 1;
}
return 0;
}
if(priority)
{
if(setpriority(PRIO_PROCESS, getpid(), priority))
BPMonitorLogaErrno("setpriority");
}
char** cmdline;
char* p;
char* start;
unsigned int numParametros = 0;
unsigned int currentParam;
char* myParams = NULL;
// preciso fazer uma copia dos parametros pois como acabei de fazer um vfork, a memoria nao pertence mais a este processo
// o vfork nao faz copia da table para o processo filho, apenas referencia o processo pai
if(parametros)
myParams = strdupa(parametros);
p = myParams;
// conta quantos parametros existem
if(p)
{
while(*p)
{
if(*p == ' ')
++numParametros;
++p;
}
// ultimo parametro
++numParametros;
}
cmdline = alloca(sizeof(char*) * (numParametros + 2)); // + 1 para o nome do processo e + 1 para o NULL terminador
// a primeira posicao eh sempre o nome do processo
cmdline[0] = name;
// o primeiro parametro sempre esta no indice 1 pois o indice 0 eh o nome do processo
currentParam = 1;
p = myParams;
start = p;
// copia os parametros para o array
if(p)
{
while(*p)
{
if(*p != ' ')
{
++p;
continue;
}
// termina a string para fazer a copia
*p = '\0';
cmdline[currentParam++] = strdupa(start);
start = ++p;
}
// ultimo parametro
cmdline[currentParam++] = strdupa(start);
}
// a ultima posicao do array sempre tem que ser NULL para o execv() saber onde ele acaba
cmdline[currentParam] = NULL;
// sobreescreve a imagem do processo com a imagem do processo especificado
// ou seja, transformo a copia do processo pai no novo processo
if(execv(path, cmdline) == -1)
BPMonitorLogaErrno("execv");
// soh chega aqui se deu erro
_exit(1);
return 1;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment