c - 从子进程获取信号后从共享内存获取数据

标签 c signals fork shared-memory

int *sharedmem(key_t *key,char k,int size){
  int shmid;
  int *segptr;
  *key=ftok('.',k);
  if((shmid=shmget(*key,size,IPC_CREAT|IPC_EXCL|0666))==-1){
    printf("Shared memory segment exists - opening as client\n");
    if((shmid = shmget(*key, size, 0)) == -1){
      perror("bad shmget");
      exit(1);
    }
  }
  else
    printf("Creating new shared memory segment\n");
  if((segptr = shmat(shmid, 0, 0)) == NULL){
    perror("bad shmat");
    exit(1);
  }
  return segptr;
}
int main(){
  ...
  mem=sharedmem(&key,'a',2);
  fpid=getpid();
  signal(SIGHUP,sighup);
  if(pid=fork()==0){
    ...
    mem[0]=1;
    kill(fpid,SIGHUP);
  }
  else {//parent
     //read data from mem[0] when receiving the signal.
  }

收到子进程的信号后,如何从父进程的 mem[0] 中读取数据? 我想通知父进程数据已写入共享内存并且父进程可以读取它。

最佳答案

在您的父级中,您可以只读取信号处理程序中的共享数据。但是,根据您想要如何处理这些数据,您可能需要采用不同的策略。例如:

  • 在信号处理程序中增加一个全局静态变量(使其成为 volatile sig_atomic_t)。然后在程序的主循环中对此进行测试,并采取适当的措施。

  • 更好,使用自管。说明here 。本质上,创建一个非阻塞 pipe() 并从信号处理程序向其中写入一个字符。 select() 在主循环中以正常方式在管道的读取端。

  • 如果您的父进程是多线程的,请考虑放弃信号处理程序并使用信号量或类似的东西。

关于c - 从子进程获取信号后从共享内存获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27804748/

相关文章:

c - 如何在C中读取二进制文件并保存到数组?

c - 初始化结构内的指针成员

c - 为什么我可以从函数中取消引用字符指针/字符串返回值?

multithreading - 运行可中断的 Rust 程序来生成线程

c - 信号引发事件停止了 Linux 中的复制过程

c - 等待信号 (POSIX)

c - fork() 使用不当?

c - 做 fork 时有趣的 parent 和 child 的行为

c - 控制反转或依赖注入(inject)——有人用 C 语言做过吗?

c++ - 使用 `fork()` 反转字符串