собственно сабж:
if(fork()==0)
{
char **str=malloc(3*sizeof(char*));
str[0] = "/bin/ls";
str[1] = "/";
str[2] = 0;
execvp("/bin/ls",str);
free(str);
exit(-1);
}
вроде не должно быть, но сторонние мысли не помешают...
собственно сабж:
if(fork()==0)
{
char **str=malloc(3*sizeof(char*));
str[0] = "/bin/ls";
str[1] = "/";
str[2] = 0;
execvp("/bin/ls",str);
free(str);
exit(-1);
}
вроде не должно быть, но сторонние мысли не помешают...
1. Выделяем память под массив указателей
2. Выделяем память под строки, указатели заносим в массив
3. Освобождаем память выделенную под указатели в размере 3*sizeif(char*);
мне, кажеться, есть утечка....
Хотя, признаюсь, как вижу "**" так порой в ступор вгоняет... По крайней мере неуверен. :(
Хотя... Блин соменния совсем одолели...... Наверное я не прав... И утечки на самом деле нет.... НАдо еще разз буквари почитать....
кстати, а что говрит valgrind
ладно прокоментирую код...
if(fork()==0)
{ // ребёнок
char **str=malloc(3*sizeof(char*)); // выделяем память в ребёнке
str[0] = "/bin/ls"; // строки в стрике - тут утечки быть не может
str[1] = "/";
str[2] = 0;
execvp("/bin/ls",str); // при удачном вызове exec возникают вопросы: освободится ли память при смерти процесса? освободится ли память при экзеке? освободится ли она вообще?
free(str); // это обработка ошибок exec, поидее даже без этой строчки при смерти процесса выделенная им память должна освобождаться, но в этом есть сомнения.
exit(-1);
}
кстати, а что говрит valgrind
написал сюда, потому что влом было его запускать smile + не знаю, правильно ли он будет с fork'ами работать... потом посмотрю...
Вроде нет утечки. Цитата из man execve(3p):
...shall replace the current process image with the new image...
...
Any shared memory segments attached to the calling process image shall not be attached to the new process image.
...
Any blocks of typed memory that were mapped in the calling process are unmapped, as if munmap() was implicitly called to unmap them.
...
Memory mappings created in the process are unmapped before the address space is rebuilt for the new process image.
Так что всё адресное пространство пересобирается, а отображения памяти через mmap() закрываются.
Кстати, (на всякий случай) открытые файлы не закрываются.
Вроде нет утечки. Цитата из man execve(3p):
мда, меня чего-то серьёзно заклинило.... спасибо smile