¿Por qué se ioctl () no bloqueando?
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
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 unint
. -
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
...?