-1

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

プロセスは実際には強制終了されません!! まだ実行中です...ライトを投げてください...ありがとう...

4

2 に答える 2

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

ほとんどのアーキテクチャでは、スタックは下に向かって成長します。あなたはおそらく言いたいでしょう:

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

2 番目の質問では、プロセス停止していますが、親プロセスはそれを待っていません。これはいわゆる「ゾンビ」プロセスです。

于 2012-09-11T16:51:15.687 に答える
0

死んでいますが、親は刈り取るのを忘れていました。wait(2)これを行うには、関数の 1 つを使用し、必要に応じてSIGCHLDハンドラーを設定します。

于 2012-09-11T16:33:29.413 に答える