title: Can't connect a Unix domain socket using Python: No such file or directory
body: <p>I have several pieces of codes to establish a Unix domain socket and a service using this socket. While there are some confusing errors here leading to a failure.</p>
  
  <p>the code that creats the Unix domain socket is written in c:</p>
  
  <pre><code>#include &lt;sys/socket.h&gt;
  #include &lt;sys/stat.h&gt;
  #include &lt;sys/wait.h&gt;
  #include &lt;sys/un.h&gt;
  #include &lt;unistd.h&gt;
  #include &lt;fcntl.h&gt;
  #include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;string.h&gt;
  #include &lt;signal.h&gt;
  #include &lt;errno.h&gt;
  
  int main(int ac, char *av[])
  {
  if (ac != 4) {
      printf("Usage: %s dummy-fd sockpath binary\n", av[0]);
      exit(-1);
      }
  
      char *sockpn = av[2];
      char *bin = av[3];
  
      int srvfd = socket(AF_UNIX, SOCK_STREAM, 0);
      if (srvfd &lt; 0) {
      perror("socket");
      exit(-1);
      }
  
      fcntl(srvfd, F_SETFD, FD_CLOEXEC);
  
      struct stat st;
      if (stat(sockpn, &amp;st) &gt;= 0) {
      if (!S_ISSOCK(st.st_mode)) {
          fprintf(stderr, "socket pathname %s exists and is not a socket\n",
              sockpn);
          exit(-1);
      }
  
      unlink(sockpn);
      }
  
      struct sockaddr_un addr;
      addr.sun_family = AF_UNIX;
      snprintf(&amp;addr.sun_path[0], sizeof(addr.sun_path), "%s", sockpn);
      if (bind(srvfd, (struct sockaddr *) &amp;addr, sizeof(addr)) &lt; 0) {
          fprintf(stderr, "WARNING: cannot bind to socket %s (%s), exiting\n",
                  sockpn, strerror(errno));
      exit(-1);
      }
  
      // allow anyone to connect; for access control, use directory permissions
      chmod(sockpn, 0777);
  
      listen(srvfd, 5);
      signal(SIGCHLD, SIG_IGN);
      signal(SIGPIPE, SIG_IGN);
  
      for (;;) {
      struct sockaddr_un client_addr;
      unsigned int addrlen = sizeof(client_addr);
  
      int cfd = accept(srvfd, (struct sockaddr *) &amp;client_addr, &amp;addrlen);
      if (cfd &lt; 0) {
          perror("accept");
          continue;
      }
  
      int pid = fork();
      if (pid &lt; 0) {
          perror("fork");
          close(cfd);
          continue;
      }
  
      if (pid == 0) {
          // Child process
          dup2(cfd, 0);
          dup2(cfd, 1);
          close(cfd);
  
          execl(bin, bin, 0);
          perror("execl");
          exit(-1);
      }
  
      close(cfd);
      }
  }
  </code></pre>
  
  <p>the client Python to using this sock is as follow(unixclient.py):</p>
  
  <pre><code>def call(pn, req):
      sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
      sock.connect(pn)
      sock.send(req)
      sock.shutdown(socket.SHUT_DOWN)
      data = ""
      while True:
          buf = sock.recv(1024)
          if not buf:
               break
          data += buf
      sock.close()
      return data
  </code></pre>
  
  <p>And I trigger this piece of client code in another Python code, by importing this file and call the <code>call</code> funciton:<strong>(Both "/jail/zoobar/echosvc" and "/jail/zoobar/echosvc/sock" will fail)</strong></p>
  
  <pre><code>   resp = call("/jail/zoobar/echosvc", str1)
  </code></pre>
  
  <p>There the error occurs, showing that:</p>
  
  <pre><code>   FIle "zoobar/unixclient.py", line 8, in call
      sock.connect(pn)
     File "&lt;string&gt;", line 1, in connect
     error: [ERROR 2] No such file or directory
  </code></pre>
  
  <p>Yet I swear the directory and the socket does exist(/jail/zoobar/echosvc/sock), and the permission is correct, too(777), so I can't understand this weird error. Does anyone know about it?</p>
  
  <p>I would appreciate very much for sparing time to help.</p>