clone()系统调用无法正常工作

时间:2012-09-11 16:29:25

标签: linux clone

我花了很多时间知道在clone()中使用linux系统调用的方法。我编写了以下程序,但它无法正常工作....

#define _GNU_SOURCE
#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
#include<sched.h>
#include<sys/types.h>

int sched2()
{
printf("it is working\n");

}
int main(int argc, char *argv[])
{
printf("in the main\n");
void *stack=malloc(65536);
int Pid=clone(sched2, stack, 0, NULL);
printf("%d\n",Pid );
if(Pid==-1)
{
    printf("clone error\n");
    exit(1);
}
sleep(100);

printf("yea2");
exit(0);
}

正如我所料,应该打印字符串it is working ......以及......

in the main
2534

没有打印it is working字符串。此外,当我获取新创建的内核线程的进程ID并发出

kill -9 2534

我用ps命令检查了终端上的进程,它应该是这样的......

 PID    TTY       TIME CMD
2209 pts/2    00:00:00 bash
2533 pts/2    00:00:00 a.out
2534 pts/2    00:00:00 a.out <defunct>
2535 pts/2    00:00:00 ps

这个过程实际上并没有被杀!它还在运行......请点亮一些......谢谢...

2 个答案:

答案 0 :(得分:2)

void *stack=malloc(65536);
int Pid=clone(sched2, stack, 0, NULL);

在大多数架构中,堆栈向下增长。你可能想说:

clone(sched2, stack + 65536, 0, NULL);

对于第二个问题,进程 已死,但父进程尚未等待。这是一个所谓的“僵尸”过程。

答案 1 :(得分:0)

已经死了,但是父母忘了收获它。使用其中一个wait(2)函数执行此操作,可选择设置SIGCHLD处理程序。