Я пытаюсь отправить массив структур через трубу. У меня есть на структуру: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:
без каких-либо других. Что я делаю не так?
EDIT
Обновленный код в соответствии с предложениями:
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
Update 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:
Вы не должны использовать 'sizeof' в своих' write' и 'read' вызовах. Вы читаете и записываете количество байтов в указателе (например, 4 или 8) - вам нужно передать фактическую длину данных. –
Не могли бы вы объяснить? –
Вскоре добавлю ответ. –