我在Linux上有两个进程A和B。我想与进程B共享进程A的文件描述符,现在我只是将其序列化为a char*并将其传递给execl参数,但这是行不通的。
char*
execl
Ac看起来像这样:
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); }
BC看起来像这样:
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);
但这是行不通的,我也不明白为什么不这样做。我该如何进行这项工作?如果它的工作原理,它是经过共享父母和孩子之间的文件描述符的最佳解决方案fork和一个exec?
fork
exec
该问题与我提出的问题无关,这是由@OliCharlesworth指出的传递整数的错误方式引起的。请关闭此问题。
File descriptors are always passed between a parent and child process
当您fork进行处理时,在父级(在时fork())打开的文件描述符将隐式传递给子级。无需显式发送它们。
fork()
例如:
伪代码如下所示:
在过程 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); }
在子进程 B中, 您可以执行以下操作:
int fd = argv[1][0]; /* now do whatever you want with the fd...*/
编辑:
如果进程不同,则需要 显式 传递文件描述符。通常使用UNIX域套接字(如果使用LinuxFlavors)来完成此操作。