Guía de seguimiento dinámico de Solaris

Subrutinas

Las subrutinas se diferencias de las acciones en que, normalmente, sólo afectan al estado interno de DTrace. Por lo tanto, no hay subrutinas destructivas y, además, éstas nunca realizarán un seguimiento de los datos en las memorias intermedias. Muchas subrutinas tienen elementos análogos en las interfaces de la Sección 9F o la Sección 3C. Consulte Intro(9F) e Intro(3) para obtener más información sobre las subrutinas correspondientes.

alloca()

void *alloca(size_t size)

alloca() asigna el número de bytes especificado en size fuera del espacio temporal y devuelve un puntero a la memoria asignada. Se garantiza que el puntero devuelto presente una alineación de 8 bytes. El espacio temporal sólo es válido durante la duración de una cláusula. La memoria asignada con alloca() se desasignará cuando se complete la cláusula. Si no hay suficiente espacio temporal disponible, no se asignará ninguna memoria y se generará un error.

basename()

string basename(char *str)

basename() es un elemento análogo del lenguaje D para basename(1). Esta subrutina crea una cadena formada por una copia de la cadena especificada, aunque sin un prefijo terminado en /. La cadena devuelta se asigna fuera de la memoria temporal y, por lo tanto, sólo es válida durante la duración de la cláusula. Si no hay suficiente espacio temporal disponible, basename no se ejecuta y se genera un error.

bcopy()

void bcopy(void *src, void *dest, size_t size)

bcopy() copia el número de bytes especificado en size de la memoria a la que señala src a la memoria a la que señala dest. Toda la memoria de origen debe encontrarse fuera de la memoria temporal, y toda la memoria de destino debe encontrarse dentro. Si no se cumplen estas condiciones, no se realizará la copia y se generará un error.

cleanpath()

string cleanpath(char *str)

cleanpath() crea una cadena formada por una copia de la ruta que indica str, aunque con determinados elementos redundantes eliminados. En concreto, se eliminan los elementos "/./" de la ruta y se contraen los elementos "/../". Los elementos /../ de la ruta se contraen independientemente de los vínculos simbólicos. Por lo tanto, es posible que cleanpath() pueda utilizar una ruta válida y devolver una ruta no válida más corta.

Por ejemplo, si str es " /foo/../bar" y /foo es un vínculo simbólico a /net/foo/export, cleanpath() devolverá "/bar", aunque bar sólo puede estar en /net/foo y no en /. Esta limitación se debe al hecho de que la llamada a cleanpath() se realiza en el contexto de una activación del sondeo, en el que no se puede realizar la resolución completa de vínculos simbólicos ni utilizar nombres arbitrarios. La cadena devuelta se asigna fuera de la memoria temporal y, por lo tanto, sólo es válida durante la duración de la cláusula. Si no hay suficiente espacio temporal disponible, cleanpath no se ejecuta y se genera un error.

copyin()

void *copyin(uintptr_t addr, size_t size)

copyin() copia el tamaño especificado en bytes de la dirección de usuario especificada en la memoria intermedia temporal de DTrace y devuelve la dirección de esta memoria intermedia. La dirección de usuario se interpreta como una dirección en el espacio del proceso asociado al subproceso actual. Se garantiza que el puntero de memoria intermedia resultante presente una alineación de 8 bytes. La dirección en cuestión debe corresponderse con la página fallida en el proceso actual. Si la dirección no se corresponde con la página fallida o si no hay suficiente espacio temporal disponible, se devuelve el valor NULL y se genera un error. Consulte el Capítulo 33Seguimiento de procesos de usuario para conocer las técnicas que permiten reducir las probabilidades de que se produzcan errores de copyin.

copyinstr()

string copyinstr(uintptr_t addr)

copyinstr() copia la cadena de C finalizada con un valor "null" de la dirección de usuario especificada en la memoria intermedia temporal de DTrace y devuelve la dirección de esta memoria intermedia. La dirección de usuario se interpreta como una dirección en el espacio del proceso asociado al subproceso actual. La longitud de la cadena está limitada por el valor definido por la opción strsize; consulte el Capítulo 16Opciones y optimizables para obtener información. Al igual que en copyin, la dirección especificada debe corresponderse con una página fallida en el proceso actual. Si la dirección no se corresponde con la página fallida o si no hay suficiente espacio temporal disponible, se devuelve el valor NULL y se genera un error. Consulte el Capítulo 33Seguimiento de procesos de usuario para conocer las técnicas que permiten reducir las probabilidades de que se produzcan errores de copyinstr.

copyinto()

void copyinto(uintptr_t addr, size_t size, void *dest)

copyinto() copia el tamaño especificado en bytes de la dirección de usuario especificada en la memoria intermedia temporal de DTrace indicado por dest. La dirección de usuario se interpreta como una dirección en el espacio del proceso asociado al subproceso actual. La dirección en cuestión debe corresponderse con la página fallida en el proceso actual. Si la dirección no se corresponde con una página fallida o si la memoria de destino se encuentra fuera del espacio temporal, no se realiza la copia y se genera un error. Consulte el Capítulo 33Seguimiento de procesos de usuario para conocer las técnicas que permiten reducir las probabilidades de que se produzcan errores de copyinto.

dirname()

string dirname(char *str)

dirname() es un elemento análogo del lenguaje D para dirname(1). Esta subrutina crea una cadena formada por todos los niveles del nombre de ruta especificado por str, excepto el último. La cadena devuelta se asigna fuera de la memoria temporal y, por lo tanto, sólo es válida durante la duración de la cláusula. Si no hay suficiente espacio temporal disponible, dirname no se ejecuta y se genera un error.

msgdsize()

size_t msgdsize(mblk_t *mp)

msgdsize() devuelve el número de bytes del mensaje de datos al que señala mp. Consulte msgdsize(9F) para obtener más información. msgdsize() sólo incluye bloques de datos del tipo M_DATA en el recuento.

msgsize()

size_t msgsize(mblk_t *mp)

msgsize() devuelve el número de bytes del mensaje al que señala mp. A diferencia de msgdsize(), que devuelve sólo el número de bytes de datos, msgsize () devuelve el número total de bytes del mensaje.

mutex_owned()

int mutex_owned(kmutex_t *mutex)

mutex_owned() es una implementación de mutex_owned(9F). mutex_owned() devuelve un valor distinto a cero si el subproceso de llamada contiene actualmente la exclusión mutua del núcleo especificada o el valor cero si la exclusión mutua adaptable especificada no tiene actualmente ningún propietario.

mutex_owner()

kthread_t *mutex_owner(kmutex_t *mutex)

mutex_owner() el puntero de subproceso del propietario de la exclusión mutua del núcleo adaptable especificada. mutex_owner() devuelve el valor NULL si la exclusión mutua adaptable especificada no tiene actualmente ningún propietario o si la exclusión mutua especificada es circular. Consulte mutex_owned(9F).

mutex_type_adaptive()

int mutex_type_adaptive(kmutex_t *mutex)

mutex_type_adaptive() devuelve un valor distinto a cero si la exclusión mutua del núcleo especificada es del tipo MUTEX_ADAPTIVE o el valor cero si no es de ese tipo. Las exclusiones mutuas son adaptables si cumplen una o varias de las siguientes condiciones:

Consulte mutex_init(9F) para obtener más información sobre las exclusiones mutuas. La mayoría de las exclusiones mutuas del núcleo de Solaris son adaptables.

progenyof()

int progenyof(pid_t pid)

progenyof() devuelve un valor distinto a cero si el proceso de llamada (el proceso asociado al subproceso que está activando actualmente el sondeo coincidente) se encuentra entre la progenie del Id. de proceso especificado.

rand()

int rand(void)

rand() devuelve un entero seudoaleatorio. El número devuelto es un número débil pseudoaleatorio que no debe utilizarse para ninguna aplicación criptográfica.

rw_iswriter()

int rw_iswriter(krwlock_t *rwlock)

rw_iswriter() devuelve un valor distinto a cero si un escritor mantiene o desea realizar un bloqueo de lector-escritor. Si sólo los lectores mantienen el bloqueo y no hay ningún escritor bloqueado, o si no se realiza ningún bloqueo, rw_iswriter() devuelve el valor cero. Consulte rw_init(9F).

rw_write_held()

int rw_write_held(krwlock_t *rwlock)

rw_write_held() devuelve un valor distinto a cero si un escritor mantiene actualmente un bloqueo de escritor-lector. Si sólo los lectores mantienen el bloqueo o si no se realiza ningún bloqueo, rw_write_held() devuelve el valor cero. Consulte rw_init(9F).

speculation()

int speculation(void)

speculation() reserva una memoria intermedia de seguimiento especulativo para su uso con speculate() y devuelve un identificador para esta memoria intermedia. Consulte el Capítulo 13Seguimiento especulativo para obtener más información.

strjoin()

string strjoin(char *str1, char *str2)

strjoin() crea una cadena formada por str1 en combinación con str2. La cadena devuelta se asigna fuera de la memoria temporal y, por lo tanto, sólo es válida durante la duración de la cláusula. Si no hay suficiente espacio temporal disponible, strjoin no se ejecuta y se genera un error.

strlen()

size_t strlen(string str)

strlen() devuelve la longitud de la cadena especificada en bytes, a excepción del byte nulo final.