最近我遇到了一个关于多进程共享内存的问题。考虑下面的代码,主要目的是让子进程受到itimer的信号处理程序的警告,做一些输出。但让我困惑的是,当我在CLONE()函数中设置CLONE_VM标志时,itimer可能出错,并且输出文本将填充您的控制台。
我期望的是:打印“——警报!\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;
}

最佳答案

我真的警告你不要这样做。共享内存不仅意味着应用程序内存,还意味着库内存(标准库和您可能使用的任何第三方库),而且它们可能不准备让其他进程破坏它们的内部数据结构,特别是当它们认为自己在运行单线程时。
如果您只想让一个进程在应用程序的公共可见接口中拥有一个线程的可杀死PID,为什么不让实际的代码在线程中运行,并生成一个无用的子进程,它只做for(;;)pause();?然后,线程通过退出来响应这个子进程的死亡。

10-02 02:12