Created
October 3, 2012 14:08
-
-
Save mezzatto/3827099 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*! | |
* 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