C-如何在叉-Exec之后的两个过程之间创建一个套接字



我正在学习C,这是我的问题:我需要将2个进程与套接字AF_UNIX连接。我的问题是:我该如何实现?

我已经尝试了一些结果不佳的事情:

  • 试图通过FD。

  • 尝试进行DUP,但再次失败,两个过程没有从父进程中获取任何消息。

我可以在父级中打开一个套接字,然后使用Execl传递文件描述符?还是我应该尝试一些更"复杂"的东西?

编辑:代码这是P1.C

int main (){
  printf("Hello this is process 1n");
int fd=open("./foo",O_RDWR);
int h=fork();
if(h==0)
{
    sleep(2);
    dup2(fd,0);//note we will be loosing standard input in p2
    execvp("./client",NULL);
}
else
{
    printf("This is from p1 processn");
    write(fd,"buf",4);
                //do some process with p1
    printf("This is end of p1 processn");
}
return 0;

}

这是P2.C

int main (int argc, char * argv[]){
int fd=atoi(argv[1]);      
char buf[1024];
int n=read(fd,buf,1024);
buf[n]='';
printf("This is from p2n");
write(1,buf,strlen(buf));
    exit(EXIT_SUCCESS);

}

注意:我不是要使用插座。

这是UNIX插座的描述,是代码中的示例。

您需要将其中一个分叉的流程指定为服务器,而另一个则将其指定为客户端。在服务器中,您必须等待连接。在客户中,您必须建立通信。

链接中是每种服务的示例。不要对代码的长度感到震惊 - 大部分是注释。

请注意,如果您只想在进程之间进行"本地"通信,则可能需要研究IPC:FIFOS,共享内存,消息传递。它们更容易实施。

插座非常适合解释性通信,我一直在使用它们,但是分配端口可能是一个问题,因为,整数值几乎不是一个富裕的名称空间。如果两个进程在同一节点上运行,则命名Pipes/fifos是一个有用的选项。他们生活在普通的Linux文件系统中,其名称看起来像其他任何文件。另外,您可以使用更简单的打开/读/写/关闭系统调用。您甚至可以使用Echo和Cat命令之类的内容写信给它们,而CAT命令从中读取。使用MKFIFO命令创建FIFO。

因此,一个重要的问题是套接字文件描述符是否实时execvp?谷歌搜索这个问题把我带到这里...根据我搜索的内容,答案是肯定的。

https://linux.die.net/man/3/execve

因此,您可以使用SocketPair创建一对插座,然后确保子进程通过ARGC,ARGV。

知道新的插座存在
int fdl[2];
socketpair(AF_UNIX,SOCK_STREAM,0,fdl);

如果我错了,只需使用孩子的PID作为Sun_Path的一部分创建一对AF_UNIX插座,因为孩子和父母都知道这个数字。

最新更新