【问题标题】:How to send integer with pipe between two processes!如何在两个进程之间使用管道发送整数!
【发布时间】:2011-07-11 08:35:17
【问题描述】:

我正在尝试在 POSIX 系统中使用管道发送整数,但 write() 函数正在发送字符串或字符数据。有没有办法用管道发送整数?

问候

【问题讨论】:

    标签: c linux ipc pipe


    【解决方案1】:

    以下一个适用于写入管道和从管道读取:

    stop_daemon =123;
    res = write(cli_pipe_fd_wr, &stop_daemon, sizeof(stop_daemon));
    ....
    res = read(pipe_fd_rd, buffer, sizeof(int));
    memcpy(&stop_daemon,buffer,sizeof(int));
    printf("CLI process read from res:%d status:%d\n", res, stop_daemon);
    

    输出:

    CLI process read from res:4 status:123
    

    【讨论】:

      【解决方案2】:

      Aschhelpler 的回答是正确的,但如果这可以在以后发展,我建议您使用某种简单的协议库,例如 Google 的 Protocol Buffers,或者只是带有一些基本架构的 JSON 或 XML。

      【讨论】:

        【解决方案3】:

        要么发送一个包含整数的 ASCII 表示的字符串,例如 12345679,要么发送包含 int 的二进制表示的四个字节,例如,0x00、0xbc、0x61、0x4f。

        在第一种情况下,您将使用诸如atoi() 之类的函数来取回整数。

        【讨论】:

          【解决方案4】:

          安全的方法是使用snprintf 和strtol。

          但是,如果您知道两个进程是使用相同版本的编译器创建的(例如,它们是 forked 的同一个可执行文件),您可以利用 C 中的任何内容都可以读取或写入这一事实作为char的数组:

          int n = something();
          write(pipe_w, &n, sizeof(n));
          
          int n;
          read(pipe_r, &n, sizeof(n));
          

          【讨论】:

          • 每个指针都可以转换为 *char。但是我不确定在不违反严格的别名规则的情况下是否相反是正确的?
          • @cebewee:不确定你的问题是什么。 (short*)(char*) &n 在取消引用时会违反严格的别名。但是short first_two_bytes; memcpy(&first_two_bytes, &n, sizeof(first_two_bytes)); 并没有违反严格的别名。
          • @cebewee - 这不是 char *,它是 void *。每个指针都可以是 void *。虽然你可能仍然是对的。这可能违反了严格的别名规则,并且在第二种情况下n 的值可能不会改变。
          • 像write 和read 这样处理void* 中数据的函数通常必须将指针转换为char* 或unsigned char*。 (酌情插入“或const ...”。)但出于这个原因,char 和unsigned char 左值被禁止进行严格混叠优化。
          • 你是对的。我将通过 char* 写入 int (这是允许的)与通过 int* 访问 char (这违反了严格的别名)混淆了。
          猜你喜欢
          • 2020-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-13
          • 2023-04-03
          • 2011-02-16
          • 2011-10-16
          • 1970-01-01
          相关资源
          最近更新 更多