【问题标题】:clone( ) system call not working correctlyclone() 系统调用不能正常工作
【发布时间】:2012-09-04 15:26:04
【问题描述】:

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

#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

进程实际上并没有被杀死!!它还在运行...请给点灯...谢谢...

【问题讨论】:

  • wait(50)(在sched2)可能不会像你认为的那样做......
  • 其实你是对的......这就是我编辑并删除它的原因......无论如何,非常感谢...... :)

标签: linux clone


【解决方案1】:
void *stack=malloc(65536);
int Pid=clone(sched2, stack, 0, NULL);

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

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

对于第二个问题,进程死了,但父进程没有等待它。这是一个所谓的“僵尸”进程。

【讨论】:

  • 你是对的,绝对!!!!.... 非常感谢....但是有个小疑问,如果我写的是前一种方式...为什么我没有收到错误??
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2017-10-27
    • 2014-05-30
    相关资源
    最近更新 更多