我試圖通過管道發送一個結構數組。我有一個結構: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) - 您需要傳遞數據的實際長度。 –
你能解釋一下嗎? –
我會盡快添加答案。 –