通过管道失败将结构写入孩子

Posted

技术标签:

【中文标题】通过管道失败将结构写入孩子【英文标题】:Writing struct to child through pipe failing 【发布时间】:2013-04-13 03:51:47 【问题描述】:

我正在尝试分叉一个孩子并向其写入一个结构,但由于某种原因,写入失败。这是我到目前为止所得到的:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
    pid_t pid;
    int pfd[2];
    int rv;
    if(pipe(pfd) == -1)
        printf("Pipe failed\n");
    

    struct t
        int count[26];
        char array[4];
    ;
    struct t st;

    if((pid = fork()) < 0)
        printf("Fork error\n");
    else if(pid == 0)
        close(pfd[1]);
        rv = read(pfd[0],st,sizeof(struct t));
        printf("Read string: %d\n",rv);
    else
        int i = 0;
        for(i = 0; i < 26; i++)
            st.count[i] = i;
        
        for(i = 0; i < 3; i++)
            st.array[i] = 'A';
        
        st.array[3] = '\0';

        close(pfd[0]);
        rv = write(pfd[1],st,sizeof(struct t));
        printf("wrote: %d",rv);
        close(pfd[1]);
    

这让我整晚都快要死了。我怀疑这与我没有完全理解指向结构的指针有关。我打印了 sizeof(struct t) ,它返回了 108 个字节(如预期的那样),我认为 st 是指向结构开头的指针,这意味着写入命令将从那里开始并写入前 108 个字节,但显然情况并非如此.我错过了什么?

【问题讨论】:

你需要传递st的地址。将写命令的参数改为&amp;st 在写命令中用&st替换st时返回值还是-1 此代码无法编译。您是否没有注意到这一点并正在运行一些旧版本的程序?我确实做到了。 write(..., st, ...) 应该产生 incompatible type for argument 2 of 'write' 【参考方案1】:

试试&amp;stst 是结构本身。 &amp; 从中取出一个指针。

您可能需要启用(或注意)编译器警告。在编译命令中添加-Wall-Wall -Wextra


您需要包含read 函数的头文件。

#include <unistd.h>

现在您应该会收到错误消息。

【讨论】:

我试过 &st 无济于事。这段代码可以编译,所以我不确定要发出什么警告。 已更新。添加所有相关的头文件。

以上是关于通过管道失败将结构写入孩子的主要内容,如果未能解决你的问题,请参考以下文章

如何多次写入/读取管道

命名管道和分叉令人头疼

来自管道的多个固定大小记录的读取器

在 ReSharper 测试运行程序中显示测试输出

当read()阻塞时如何退出while循环

通过管道读取和写入数据