0

最近、マルチプロセスとのメモリ共有に関する問題に遭遇しました。以下のコードを検討してください。主な目的は、子プロセスにitimerのシグナルハンドラーによってアラームを発生させ、何らかの出力を実行させることです。しかし、私を混乱させるのは、clone()関数でCLONE_VMフラグを設定すると、itimerが失敗し、出力テキストがコンソールに詰め込まれる可能性があることです。

私が期待しているのは:print "--- Alarm!\ n---ChildThreadが起動されます。\n--- foo=10"毎秒。

実際の状況は次のとおりです。上記のテキストを非常に高速に繰り返し印刷します。

子プロセスを生成し、その間に親のメモリを共有させる方法を知りたいです。どうもありがとう。

#define _GNU_SOURCE

#include <stdio.h>
#include <signal.h>
#include <sched.h>
#include <stdlib.h>
#include <linux/sched.h>
#include <sys/time.h>

static volatile int foo = 100;

int pidChild;

void AlarmThread(int sig)
{
    printf("---Alarm!\n");
    kill(pidChild, SIGCONT);
}

int ChildThread(void *arg)
{
    raise(SIGSTOP);
    while(1)
    {
        printf("---ChildThread is awaked.\n");
        printf("---foo=%d\n", foo);     // If CLONE_VM is set, this variable may be changed by main thread.
        raise(SIGSTOP);
    }
    return 0;
}

int main(int argc, char **argv)
{
    void *stack = malloc(4000) + 4000;
    struct itimerval itimer;
    signal(SIGALRM, AlarmThread);
    pidChild = clone(ChildThread, stack, CLONE_VM | CLONE_SIGHAND, NULL);
    itimer.it_interval.tv_sec = 1;
    itimer.it_interval.tv_usec = 0;
    itimer.it_value = itimer.it_interval;
    setitimer(ITIMER_REAL, &itimer, NULL);   // Set up a 1 tick-per-sec timer.
    foo = 10;   // Test if the child thread shares the main thread's memory.
    while(1);
    return 0;
}
4

2 に答える 2

3

これを行うことに対して本当に警告します。メモリの共有とは、アプリケーション メモリだけでなく、ライブラリ メモリ (標準ライブラリおよび使用する可能性のあるサード パーティ製ライブラリ) も意味します。シングルスレッドで実行されます。

アプリケーションの公に見えるインターフェイスの一部として、スレッドの強制終了可能な PID を持つプロセスが必要な場合は、実際のコードをスレッドで実行し、何もしない無駄な子プロセスを生成してみませんfor(;;)pause();か? 次に、終了することによって、スレッドがこの子プロセスの終了に応答するようにします。

于 2012-09-19T18:16:36.837 に答える
0

しかし、私を混乱させているのは、clone() 関数で CLONE_VM フラグを設定すると、itimer がうまくいかず、出力テキストがコンソールに詰め込まれてしまうことです。

「うまくいかないかもしれない」とは?どうしたの?何を期待していましたか?質問するときは、明確にする必要があります。

CLONE_VM は itimer とはほとんど関係ありません。あなたが何をしようとしているのか、またその理由を定式化することさえできずに、このような高度なシステムコールを使用しているという事実は、これが学校の課題であると私に信じさせます.

于 2012-09-19T14:34:23.500 に答える