【问题标题】:Can I send char* with sigqueue to another process我可以将带有 sigqueue 的 char* 发送到另一个进程吗
【发布时间】:2013-04-12 14:12:13
【问题描述】:

这是我在客户端程序中的一部分代码

      union sigval toServer;   

      char *test = "dummy";
      serverPID = atol(buf2);
      toServer.sival_ptr = (void *)test;


      // Register to server
      if (sigqueue(serverPID, SIGUSR1, toServer) == -1) {  // register
         fprintf(stderr," Server isn't ready!\n");
         return 1;
      }

这是我在服务器程序中的处理程序

      static void register_handler(int signo, siginfo_t* info, void *context) {   

      registeredProgramID = info->si_pid;

      if(info->si_value.sival_ptr != NULL)
       fprintf(stderr," sent value is  = %s \n" ,(char *)info->si_value.sival_ptr);
      }

没有错误,但我无法收到我发送的内容。它打印出一些奇怪的东西。

【问题讨论】:

  • 如何创建服务器和客户端进程?
  • 在同一台电脑和 2 个终端上 gcc -c server.c gcc -o serv server.o ./serv 与客户端相同
  • 您在进程之间传递指向字符串的指针。字符串数据在客户端的地址空间中分配,并且该指针在服务器的地址空间中无效(如果一个进程由另一个进程使用fork 生成,则可能是这样,但是,我发现情况并非如此)。您应该使用其他 IPC,请参阅this 问题。
  • 嗯,我明白了。谢谢 :)。 fifo 是我的第二个选择。我认为这个更容易。

标签: c signals sigqueue


【解决方案1】:

不,你不能。

您可以发送char*,但接收进程通常无法访问发送进程的内存,并且内存可能映射不同。当您访问接收到的指针指向的内存地址时,结果是未定义的(即特定于平台且不一定可重复)。 最可能的结果是某种内存保护错误或读取的内存包含随机值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-23
    • 2017-01-20
    • 2022-01-21
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 2010-11-08
    相关资源
    最近更新 更多