Share a file descriptor between parent and child after fork and exec
c, exec, file-descriptor, fork, linux
Solution
`File descriptors are always passed between a parent and child process`
When you `fork` a process, the file descriptors that are open in the parent(at the time of `fork()`) are implicitly passed on to the child. There is no need to send them explicitly.
For example:
The pseudo-code looks as follows:
In process A:
fd = open_socket_or_file;
char str_fd[3];
str_fd[0]=fd;
str_fd[1]=fd;
str_fd[2]=0;
if(fork()==0)
{
execl("./B",str_fd,NULL);
}
In the child process B you can do:
int fd = argv[1][0];
/* now do whatever you want with the fd...*/
EDIT:
In case the processes are different, you need to pass the file descriptor explicitly. This is generally done using UNIX-Domain Sockets(If you are using Linux Flavors). For code related to this, you can see this answer
Problem
I have two processes on Linux, A & B. I want to share the file descriptor from process A with process B, now I just serialize it to a `char*` and pass it to the `execl` parameters, but that doesn't work. A.c looks like this: ``` union descriptor{ char c[sizeof(int)]; int i; } fd; pid_t pid; fd.i = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Perform other socket functions pid = fork(); if(pid == 0){ // Read data from socket if(execl("./B", fd.c, NULL) < 0){ exit(EXIT_FAILURE); }else( exit(EXIT_SUCCESS); } }else if(pid < 0){ exit(EXIT_FAILURE); }else{ waitpid(pid, NULL, 0); } ``` B.c looks like this: ``` union descriptor{ char c[sizeof(int)]; int i; } fd; memcpy(&fd.c[0], argv[0], sizeof(int)); write(fd.i, "TEST", 4); close(fd.i); ``` But this doesn't work, and I don't really understand why not. How can I make this work? And if it works, is it the best solution to share a file descriptor between a parent and a child after a `fork` and a `exec`? Update The problem is unrelated to the question I asked, it is caused by a wrong way of passing an integer as pointed out by @OliCharlesworth. Please close this question.