C 通过管道向子级写入结构失败

C 通过管道向子级写入结构失败,c,struct,ipc,pipe,C,Struct,Ipc,Pipe,我正在尝试分叉一个子对象并向其写入结构,但由于某种原因,写入失败。以下是我到目前为止得到的信息: #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"); }

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

#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]);
    }
}
#包括
#包括
#包括
int main(){
pid_t pid;
int-pfd[2];
int-rv;
如果(管道(pfd)=-1){
printf(“管道失败\n”);
}
结构t{
整数计数[26];
字符数组[4];
};
结构t st;
如果((pid=fork())<0){
printf(“Fork错误\n”);
}否则如果(pid==0){
关闭(pfd[1]);
rv=读取(pfd[0],st,sizeof(结构t));
printf(“读取字符串:%d\n”,rv);
}否则{
int i=0;
对于(i=0;i<26;i++){
标准计数[i]=i;
}
对于(i=0;i<3;i++){
st.array[i]=“A”;
}
st.array[3]='\0';
关闭(pfd[0]);
rv=写入(pfd[1],st,sizeof(结构t));
printf(“写入:%d”,rv);
关闭(pfd[1]);
}
}

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

试试
&st
st
是结构本身<代码>&从其上取下指针

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


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

#include <unistd.h>
#包括

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

您需要传递
st
的地址。将write命令的参数更改为
&st
。在write命令中将st替换为&st时,返回值仍然为-1。此代码不编译。您是否没有注意到这一点,并且正在运行一些旧版本的程序?我当然做到了。
write(…,st,…)
应该为'write'的参数2生成
不兼容的类型。
我尝试了&st,但没有结果。这段代码是编译的,所以我不确定head.Updated的警告是什么。添加所有相关的头文件。