Andrés Dufresne
Se menciona en el manual ftok()
key_t ftok(const char *pathname, int proj_id);
La función ftok() usa la identidad del archivo nombrado por la ruta dada (que debe hacer referencia a un archivo accesible existente) …
estoy confundido acerca de const char *pathname
.
¿Cuál sería la mejor práctica para ello? En mi sistema actual puedo pasar "/home/Andrew/anyfile"
pero no es posible que otros sistemas, en los que tiene que funcionar mi programa, tengan este archivo.
¿Qué tal si uso "/etc/hosts/"
o "/etc/inittab"
porque estoy seguro de que todos esos sistemas tendrán estos dos archivos? ¿Es una buena idea? ¿Puede causar algún problema?
No quiero pedirle al usuario que ingrese el nombre del archivo en el momento de la ejecución o que pase el nombre del archivo como argumento de la línea de comandos.
¿Hay alguna otra manera diferente y mejor de decidir pathname
?
¿Cuál es la mejor y más confiable?
Gracias por tu tiempo.
paxdiablo
Bueno, generalmente usaría un archivo asociado con la aplicación en sí.
Por ejemplo, teníamos una aplicación que cargaba un archivo de configuración en la memoria compartida (de una manera analizada y accesible de manera eficiente; piense en un archivo XML que se convirtió en estructuras en memoria con punteros rápidos, etc.) y creamos la memoria compartida. segmento de la ftok
derivado del propio archivo de configuración.
En el peor de los casos, si no tiene archivos de configuración para su aplicación, intente usar el ejecutable en sí. Puede estar bastante seguro de que existe en algún lugar del sistema (ya que lo está ejecutando).
Tampoco está restringido a archivos, puede usar /etc
sí mismo o /tmp
o incluso /
si debes.
Digo “si es necesario” porque es un poco peligroso. Él ftok
call le dará una clave única basada en la especificación de su archivo y su ID. Si usas tu propio archivo como /etc/andrew.conf
puede estar razonablemente seguro de que no chocará con ningún otro ftok
-llave devuelta.
Sin embargo, si usted y todos los demás deciden usar /tmp
como parte de la especificación del archivo, el único diferenciador es el ID. Por lo tanto, es mucho más fácil colisionar con otras teclas.
Lo que siempre he hecho es usar la especificación del archivo como un valor verdaderamente único para mi aplicación y luego usar la ID para lo que quiero crear en particular.
Entonces, si necesito 27 semáforos y 15 bloques de memoria compartida, ellos todos usar /etc/pax.conf
como la especificación del archivo y los ID del 1 al 42 (y mi aplicación sabe qué ID se relaciona con qué objeto).
-
“puedes usar
/etc
sí mismo o/tmp
o incluso/
si debe”. ¿Es una mala idea? Si está permitido, entonces ¿por qué no lo usaron en su aplicación? Esto me confunde. ¿Cuándo podemos usar/etc/hosts
o cualquier archivo del sistema que esté siempre presente, ¿por qué tenemos que buscar otras formas? Por favor, explícalo. Gracias– Andrew Dufresne
1 de julio de 2010 a las 6:11
Probablemente lo mejor es usar argv[0] de uno de sus ejecutables. La página de manual dice
The resulting value is the same for all pathnames that name the same file, ...
por lo que debe estar seguro, incluso si su ejecutable a veces se llama a través de un enlace simbólico más o menos.
-
¡Seguro! Pero entonces, ¿cómo otro programa sabrá al respecto? Pathname y proj_id deben ser iguales en ambos programas para que ftok() genere la misma clave. Uno de ellos usa argv[0] Entonces, ¿cómo otros sabrán al respecto? Amablemente elaborado.
– Andrew Dufresne
1 de julio de 2010 a las 14:09
-
La idea de ftok es que los dos programas compartan conocimientos comunes. Supondría que conocen los nombres ejecutables de cada uno. Luego tienes la clave adicional que ayuda a distinguir varias sesiones de una misma aplicación. En cualquier caso, debe compartir ese conocimiento común en el inicio, por ejemplo, con una variable de entorno o algo así.
– Jens Gusted
1 de julio de 2010 a las 19:35
Puede crear dinámicamente un char * para una ruta basada en un archivo de configuración o un parámetro de línea de comando, etc.
Simplemente pase ese char * a la función.
Usar “.” como primer parámetro. Enviará el directorio en ejecución actual a ftok.
¿Mejor manera de qué? ¿Confiable para qué? – ¿Tal vez es mejor describir una tarea para la que se supone que se debe usar ftok?
– pmod
1 de julio de 2010 a las 6:14
@Pmod: En realidad, necesito una cola para que mis dos programas puedan comunicarse entre sí. Lo que realmente me ha confundido es qué archivo debo pasar a ftok(), que siempre estará presente. Esta respuesta dice que está bien pasar
/etc
. Si es así, ¿por qué la gente pasa otros archivos? ¿No es fácil y mejor pasar uno de los archivos del sistema?– Andrew Dufresne
1 de julio de 2010 a las 6:23
Cuando teníamos una tarea similar (comunicación organizada entre dos programas en Linux con la ayuda de la cola de mensajes), usamos file. El primer programa (que es como un servidor, siempre en ejecución) crea un archivo con la identificación del mensaje, luego el segundo (programa de usuario) lee la identificación del mensaje de ese archivo y obtiene acceso a la cola.
– pmod
1 de julio de 2010 a las 8:04