BandaAncha.eu

Comunidad de usuarios
de fibra, móvil y ADSL

No entiendo cómo funciona la función ftok()

DrMuehehe

Quiero que diversos procesos clientes generen direcciones distintas, es decir, distintos ficheros donde se almacenarán los datos provenientes de un proceso servidor. Me han dicho que use la función ftok() pero no entiendo los parámetros que necesita para generar claves distintas y luego, como convierto cada clave en un nombre de fichero distinto. ¿Como es la estructura 'key_t'?

Ma haríais un gran favor si me ayudarais. Gracias.

Este tema está cerrado a nuevas respuestas. Abre un nuevo tema para retomar la conversación.
EiRoN

Bueno, no estoy muy puesto al día sobre ftok, pero espero poder ayudarte algo al menos :-)

key_t no es más que un tipo abstracto de datos definido, no es más que un int camuflado vamos, ftok devuelve una llave IPC generada a partir de la ruta de un fichero dado y el byte menos significativo del entero que se pasa como segundo parámetro (dependiendo del SO y de la implementación que use el segundo parámetro puede ser un tipo abstracto byte, un char o un entero, pero en cualquier caso, solo se tiene en cuenta el byte menos significativo).

En cualquier caso no creo que un mecanismo IPC sea lo más indicado para lo que quieres hacer (a menos que ya estés trabajando con IPC), podrías usar algo más sencillo como el PID del proceso, o una sencilla función hash, otra opción sería usar tempnam (que es SVID y BSD).

En fin, tampoco he trabajado mucho con ftok, pero espero haberte servido de ayuda :-)

🗨️ 5
DrMuehehe

Aún no sé muy bien por qué (es que esto es nuevo para mi, y no me acuerdo cuál fue el motivo) pero tiene que ver con el hecho que posteriormente deberé aplicar este programa que realizo con threads. El uso de ftok() es una indicación del profesor, por lo tanto, no debo usar otros métodos.

Si lo que devuelve es un entero, entonces deberé hacer una conversión a cadena para formar una ruta/fichero distinto para cada proceso cliente.

Me surge otra duda, los parámetros que utiliza ya sé como son y he leído que pueden ser aleatorios, pero sobre unos valores fijos, ¿no dará siempre el mismo valor de retorno? ¿Qué me aconsejáis para que esto no suceda?

DrMuehehe

He recibido consignas (total, tanta retórica para decir que el profe me lo ha mandao) que lo haga como tú dices, mediante el identificador del proceso (función getpid()). Pero ya he pensado en qué caso no funciona esto, y creo que es lo que me encontraré más adelante, y es cuando use varios threads sobre un único proceso cliente. En este caso el PID siempre es el mismo, obviamente, y tendré que recurrir al plan B (ftok() al canto).

🗨️ 3
BocaDePez
BocaDePez

Si vas a usar threading puedes tener problemas con lo que comentas, en ese caso sí podrías usar ftok para eludirlo.

Volviendo al tema, ftok, como bien dices, tiene la misma salida para entradas iguales, aunque eso no debería de ser un problema, puedes dejar fijo el path y variar el entero sin pudor para generar llaves distintas.

A ver si ha quedado más claro, que me explico como una patata ;-)

🗨️ 2
EiRoN

Pues eso, que me olvidé de firmar :-)

🗨️ 1