在fork和exec之后在父子之间共享文件描述符

我在Linux上有两个进程A和B。我想与进程B共享进程A的文件描述符,现在我只是将其序列化为a

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

回答:

该问题与我提出的问题无关,这是由@OliCharlesworth指出的传递整数的错误方式引起的。请关闭此问题。

回答:

File descriptors are always passed between a parent and child process

当您fork进行处理时,在父级(在时fork())打开的文件描述符将隐式传递给子级。无需显式发送它们。

例如:

伪代码如下所示:

在过程 :

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);

}

在子进程 您可以执行以下操作:

int fd = argv[1][0];

/* now do whatever you want with the fd...*/

如果进程不同,则需要 传递文件描述符。通常使用UNIX域套接字(如果使用LinuxFlavors)来完成此操作。

以上是 在fork和exec之后在父子之间共享文件描述符 的全部内容, 来源链接: utcz.com/qa/419459.html

回到顶部