Я строю DNS-клиент. Детский процесс обрабатывает запрос через сокет UDP, а родитель обрабатывает ответ. Мне нужен родитель, чтобы узнать, сколько байтов было отправлено, чтобы распечатать URL-адреса. Я пробовал следующий подход с трубой()Сигнал неисправной трубы на DNS-клиенте
childPID = fork();
pipe(fd);
if(childPID == 0){
close(fd[0]);
sent_bytes = sendDNS(sock_udp, &serverAddr, argv[2]);
memcpy(in_buf, &sent_bytes, sizeof(sent_bytes));
write(fd[1], in_buf, sizeof(sent_bytes));
exit(0);
}
else{
close(fd[1]);
int inBytes = -1;
struct sockaddr reply_addr;
n = sizeof(reply_addr);
while(inBytes < 0){
inBytes = recvfrom(sock_udp, buffer, DNS_MAX_RESPONSE, 0, &reply_addr, (socklen_t*)&n);
read(fd[0], out_buf, sizeof(sent_bytes));
memcpy(pipe_msg, out_buf, sizeof(sent_bytes));
printDNSmsg((struct dnsReply*)buffer);
}
}
Но GDB показывает SIGPIPE полученного дочернего процесса. Что мне не хватает?
Как вы напечатаете ответ DNS (буфер переменной длины)?