如何在fork-exec之后在2个进程之间创建套接字

时间:2015-05-18 14:27:49

标签: c sockets unix process

我正在学习C,这是我的问题:我需要使用套接字AF_UNIX连接2个进程。 我的问题是:我怎样才能实现这一目标?

我已经尝试过效果不佳的事情:

  • 试图通过fd。

  • 尝试重复但又失败,并且2个进程没有从父进程收到任何消息。

我可以在父级中打开一个套接字然后用execl传递文件描述符吗?或者我应该尝试一些更“复杂”的东西?

编辑:代码 这是P1.c

int main (){

  printf("Hello this is process 1\n");
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 process\n");
    write(fd,"buf",4);
                //do some process with p1
    printf("This is end of p1 process\n");
}

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]='\0';
printf("This is from p2\n");
write(1,buf,strlen(buf));
    exit(EXIT_SUCCESS);

}

注意:我没有尝试使用套接字。

3 个答案:

答案 0 :(得分:3)

Here is a description unix套接字和代码中的示例。

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

链接中是每个服务的示例。不要对代码的长度感到震惊 - 大部分都是评论。

请注意,如果您只是想要本地'进程之间的通信,你可能想要看看IPC:fifos,共享内存,消息传递。它们更容易实现。

答案 1 :(得分:0)

套接字很适合进程间通信,我一直都在使用它们,但是分配端口可能是一个问题,因为整数值几乎不是丰富的命名空间。如果两个进程通信在同一节点上运行,则命名管道/ FIFO是一个有用的选项。他们居住在普通的Linux文件系统中,其名称与任何其他文件一样。此外,您可以使用更简单的打开/读/写/关闭系统调用。您甚至可以使用echo和cat命令来写入它们,使用cat命令从中读取它们。使用mkfifo命令创建FIFO。

答案 2 :(得分:0)

一个重要的问题是套接字文件描述符是否通过execvp生存?谷歌搜索这个问题使我到这里...根据我用谷歌搜索的答案是肯定的。

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

因此您可以使用套接字对创建一对套接字,然后确保子进程通过argc,argv知道新套接字存在。

int fdl[2];
socketpair(AF_UNIX,SOCK_STREAM,0,fdl);

如果我错了,只需将孩子的pid用作sun_path的一部分来创建一对AF_UNIX套接字,因为孩子和父母都知道这个数字。