我正在学习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);
}
注意:我没有尝试使用套接字。
答案 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套接字,因为孩子和父母都知道这个数字。