Pregunta

He escrito código para el paso de descriptores de archivos entre procesos no relacionados que utilizan corrientes. El servidor debe esperar a que el cliente envíe un descriptor de archivo. Aquí está el código del servidor:

#include <sys/types.h>   
#include <sys/stat.h>  
#include <fcntl.h>  
#include <stropts.h>  
#include <stdio.h>  
#include <errno.h>  
#include <unistd.h>  

int  main(int argc, char *argv[])
{  
    int fd;  
    int pipefd[2];  
    pipe(pipefd);  
    close(pipefd[1]);  
    recvfd(pipefd[0]);  
    return 0;
}

void recvfd(int p)  
{
    struct strrecvfd rfdbuf;  
    struct stat statbuf;   
    int i;  
    i=ioctl(p, I_RECVFD, &rfdbuf);  
    printf("errno=%d\n",errno);  
    printf("recvfd=%d\n", rfdbuf.fd);  
}

Pero recibo el número de error 9 -. Descriptor de archivo incorrecto

¿Fue útil?

Solución

Usted no menciona qué sistema operativo que está ejecutando. I_RECVFD es parte de las extensiones de corrientes que normalmente sólo están presentes en System V basado sistemas operativos Unixy (AIX y Solaris por ejemplo). Otros, como Linux y BSD, no apoyarlo y probablemente nunca lo hará, POSIX tiene ahora una alternativa usando sendmsg () y recvmsg ().

Me temo que no sé por qué Linux tiene #defines I_RECVFD si no lo soporta.

Otros consejos

Nota:. La pregunta ha sido modificado ampliamente desde esta respuesta fue escrito


¿Por dónde empezar?

  • main() devuelve un int.
  • pipefd no se ha inicializado.
  • Se cierra un descriptor de archivo aleatorio.
  • Usted llama recvfd() en otro descriptor de archivo aleatorio.
  • no devuelve un valor de main().
  • Usted no utiliza el valor #define.
  • No mostrar los archivos #include necesarios para hacer esta compilación.
  • No utilizados fd variable.
  • No utilizados statbuf variable.
  • No seleccionado i valor de retorno.

Problema básico -. Uso de las variables sin inicializar

problema Subsidiaria -. Limitado comprobación de errores


problema adicional: conceptualmente, desea un servidor que se puede pasar un descriptor de archivo. Es necesario que el servidor que se va leyendo de un descriptor de archivo que otros (no relacionadas) pueden crear procesos. Tendrá que mirar los manuales con bastante cuidado, pero probablemente necesitará el servidor escucha en un socket de dominio Unix, o tal vez de leer en una FIFO (el nombre). Otros programas pueden entonces abrir la toma o FIFO y enviar su propio descriptor de archivo en el servidor.

Es este el código real? Porque en ninguna parte se crea o recibe un descriptor de fichero válido.

Nunca inicializar pipefd! Falta un

pipe(pipefd);

línea antes de la llamada close ...?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top