最近、マルチプロセスとのメモリ共有に関する問題に遭遇しました。以下のコードを検討してください。主な目的は、子プロセスに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;
}