我试图通过管道发送一个结构数组。我有一个结构:C - 通过管道发送结构数组
typedef struct visitordata {
char name[80];
char email[80];
int id;
char reg_time[9];
}visitordata;
然后我做
//...
//ds is the number of struct entries to be stored
visitordata* V;
V = (visitordata*)malloc(ds * sizeof(visitordata));
pid_t child = fork();
if(child < 0) {
perror("Fork error");
exit(1);
}
else if (child > 0) { //parent process
write(pipefd[1], &V, sizeof(V));
close(pipefd[1]);
fflush(NULL);
pause();
sleep(1);
pause();
kill(child,SIGTERM);
waitpid(child, &status, 0);
}
else { //child process
visitordata* data;
close(pipefd[1]);
read(pipefd[0], &data, sizeof(data));
close(pipefd[0]);
flush(NULL);
for (i = 0; i < ds; ++i) {
printf("Received: %s\r\n", data[i].name);
}
kill(getppid(), SIGUSR1);
pause();
}
不过,如果我有两行输入,接收到的部分只打印出一行字符串“自由”(这是我想想服务器上的用户名:[email protected]:
),然后是Received:
,没有其他任何东西。我究竟做错了什么?
编辑
更新的代码按建议:
visitordata* V;
V = (visitordata*)malloc(ds * sizeof(visitordata));
pid_t child = fork();
if(child < 0) {
perror("Fork error");
exit(1);
}
else if (child > 0) { //parent process
write(pipefd[1], V, ds * sizeof(V));
close(pipefd[1]);
fflush(NULL);
pause();
sleep(1);
pause();
kill(child,SIGTERM);
waitpid(child, &status, 0);
}
else { //child process
visitordata* data;
data = (visitordata*)malloc(ds * sizeof(visitordata));
close(pipefd[1]);
read(pipefd[0], data, ds * sizeof(data));
close(pipefd[0]);
flush(NULL);
for (i = 0; i < ds; ++i) {
printf("Received: %s\r\n", data[i].name);
}
kill(getppid(), SIGUSR1);
pause();
}
现在我的输出是这样的:
Received: 0▒:▒0▒:▒
Received:
EDIT 2
更新d
read(pipefd[0], data, ds * sizeof(data));
和
write(pipefd[1], V, ds * sizeof(V));
到
read(pipefd[0], data, ds * sizeof(visitordata));
和
write(pipefd[1], V, ds * sizeof(visitordata));
现在我的输出是:
Received: 0Tɢ0Tɢ
Received:
你不应该在'write'和'read'调用中使用'sizeof'。您正在读取和写入指针中的字节数(例如4或8) - 您需要传递数据的实际长度。 –
你能解释一下吗? –
我会尽快添加答案。 –