我尝试用 clone-execl 替代 system()
但是怎么给 clone() 分配一个合适的 Stack_Size 而不是分配一个过大的内存?
下面是代码
static int Child(void *arg){
execl("/bin/ls", "ls", "-alh", "--color=auto", "NULL");
return 0;
}
char run_program(void){
int STACK_SIZE = 10000;
void *Child_Stack = calloc(STACK_SIZE, sizeof(char));
if (Child_Stack == NULL){
return 'X';
}
if (clone(Child, Child_Stack + STACK_SIZE, CLONE_VFORK, NULL) == -1){
free(Child_Stack);
return 'X';
}
return 'V';
}
另外,return 'V'; 上面有没有必要加上 free(Child_Stack)?
先多谢各位了
你这个并不需要分配多大的栈,因为在execl后,子线程就完全独立了,并不会和父进程共享内存空间,和fork没什么区别,我测试时只需要大概1200个字节就可以了。
因为execl后那段分配的栈空间就没有用处了,所以free掉比较好。
参考 stackoverflow