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的警告是什么。添加所有相关的头文件。