I am trying to create a parent-child program where parent sends its children the FILE* ptr using unix domain sockets. I am successful in creating the child process but they are not able to receive messages from the parent process. Is there some error in "(FILE*)fd_ptr, 8" part of sendto and recvfrom. I first create a socket in parent process and then fork the process. In the child process, I again create a socket and use it to receive data from parent. Please help!
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include<sys/wait.h>
#define PORT 4444
void die(char* s){
perror(s);
exit(EXIT_FAILURE);
}
int main(){
int sockfd;
struct sockaddr_in servaddr_p;
struct sockaddr_in servaddr_c;
int len = sizeof(servaddr_p);
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0))<0)
die("socket creation failed");
memset(&servaddr_p, 0, sizeof(servaddr_p));
servaddr_p.sin_family = AF_INET; // IPv4
servaddr_p.sin_addr.s_addr = INADDR_ANY;
servaddr_p.sin_port = htons(PORT);
if(bind(sockfd, (const struct sockaddr*)&servaddr_p, sizeof(servaddr_p))<0)
die("bind failed");
FILE* fd = fopen("/home/johnny/Desktop/q3/0.txt", "r");
for(int i = 0; i<2; ++i){
int pid=fork();
if(pid==0){
sleep(1); //receiving data from parent
int* fd_ptr;
memset(&servaddr_c, 0, sizeof(servaddr_c));
servaddr_c.sin_family = AF_INET;
servaddr_c.sin_port = htons(PORT);
servaddr_c.sin_addr.s_addr = INADDR_ANY;
if(recvfrom(sockfd, (FILE*)fd_ptr, 8, 0, (struct sockaddr*)&servaddr_p, &len)<0)
die("msg not received");
exit(0);
}
else{
FILE *fd_ptr = fd; //sending data to children
sendto(sockfd, (FILE*)fd_ptr, 8, 0, (struct sockaddr*)&servaddr_c, len);
}
}
pid_t child_pid, wpid;
int status = 0;
while ((wpid = wait(&status)) > 0);
close(fd);
}