最近我遇到了一個與多進程共享內存的問題。考慮下面的代碼,主要目的是讓孩子進程由itimer的信號處理器報警,做一些輸出。但令我困惑的是,當我在clone()函數中設置CLONE_VM標誌時,itimer可能出錯,並且輸出文本將填充您的控制檯。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;
}
您是否故意忽略'fork()'和'pthread_create()'是否存在特定的原因? –
因爲我想產生一個kill() - 能夠的PROCESS,所以我不能使用pthread庫。 fork()可能是一種選擇,但在使用它的新進程中調用回調函數似乎更加複雜。由於clone()更具可定製性,所以我決定首先使用它。 – fish47
我會認真對付「克隆」比「fork」更容易的說法...... –