【发布时间】:2016-10-23 13:29:14
【问题描述】:
我想使用 clone() 函数(而不是 fork() )创建 3 个进程,并且每个进程都将其 PID 写入标准输出。但它只写入父进程,并且 clone() 由于某种原因不起作用。这是我的代码:
#define _GNU_SOURCE
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#define STACK_SIZE 1024
int foo()
{
printf( "|%d |%d |%d |%d |\n", getuid(), getgid(), getpid(), getppid() );
exit( 1 );
}
int main()
{
void* stack;
stack = malloc( STACK_SIZE );
if( !stack )
{
printf( "Stack alloc problem\n" );
exit( 0 );
}
printf( "|UID |GID |PID |PPID |\n" );
printf( "|%d |%d |%d |%d |Parent\n", getuid(), getgid(), getpid(), getppid() );
int i = 0;
for( ; i<3; i++ )
{
int err = clone( &foo, ( char * )stack + STACK_SIZE, CLONE_VM, 0 );
if( err == -1 )
perror( "clone error" );
}
free( stack );
exit( 1 );
}
【问题讨论】:
-
clone()d 进程在使用CLONE_VM时共享原始进程的内存空间,因此您为所有克隆提供了相同的堆栈来使用。这不太可能解释你的观察,但它一定会给你带来麻烦。 -
所以我应该为我创建的每个进程创建单独的堆栈?
-
是的,如果克隆共享内存,那么每个克隆都必须有一个单独的堆栈。此外,1024 字节的堆栈空间并不多。你需要多少取决于每个克隆要做什么,但是如果你调用任何库函数,那么你基本上无法确定你需要多少。我会尝试至少十倍。
-
您应该只在所有其他线程都完成后
free堆栈。否则它们可能会崩溃。 -
@immibis 克隆首先执行指定的函数(在本例中为
foo()),并在该函数返回时终止。或者他们应该。好歹。foo()表面上打印数据