【问题标题】:How to create a socket between 2 processes after fork-exec如何在 fork-exec 之后在 2 个进程之间创建一个套接字
【发布时间】:2015-05-18 14:27:48
【问题描述】:

我正在学习 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);

}

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

【问题讨论】:

  • 你能发布你的代码吗?
  • 好的,现在检查代码。
  • 最简单的方法是分叉之前打开套接字,这样fd对双方都可用。
  • 在我 fork 之后:父母应该等待连接,孩子应该连接?我应该将 fd 作为 exec 的参数传递吗?

标签: c sockets unix process


【解决方案1】:

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

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

链接中是每个服务的示例。不要被代码的长度吓到 - 大部分都是注释。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      所以一个重要的问题是套接字文件描述符是否存在于 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 套接字,因为孩子和父母都知道这个数字。

      【讨论】:

        猜你喜欢
        • 2012-10-25
        • 2018-10-19
        • 2017-02-25
        • 1970-01-01
        • 2021-12-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多