Guía de seguimiento dinámico de Solaris

system()

void system(string program, ...) 

La acción system() provoca que se ejecute el programa especificado por program como si se hubiera especificado en la shell como entrada. La cadena program puede contener cualquiera de las conversiones de formato de printf()/printa. () Deben especificar los argumentos que coincidan con las conversiones de formato. Consulte el Capítulo 12Formato de salida para obtener información sobre las conversiones de formato válidas.

En el ejemplo siguiente, se ejecuta el comando date(1) una vez por segundo:


# dtrace -wqn tick-1sec'{system("date")}'
 Tue Jul 20 11:56:26 CDT 2004
 Tue Jul 20 11:56:27 CDT 2004
 Tue Jul 20 11:56:28 CDT 2004
 Tue Jul 20 11:56:29 CDT 2004
 Tue Jul 20 11:56:30 CDT 2004

En el siguiente ejemplo, se muestra un uso más elaborado de la acción, utilizando las conversiones de printf() en la cadena program junto con las herramientas de filtrado tradicionales como, por ejemplo, las conducciones:

#pragma D option destructive
#pragma D option quiet

proc:::signal-send
/args[2] == SIGINT/
{
	printf("SIGINT sent to %s by ", args[1]->pr_fname);
	system("getent passwd %d | cut -d: -f5", uid);
}

La ejecución de la secuencia de comandos anterior devuelve una salida similar al siguiente ejemplo:


# ./whosend.d
SIGINT sent to MozillaFirebird- by Bryan Cantrill
SIGINT sent to run-mozilla.sh by Bryan Cantrill
^C
SIGINT sent to dtrace by Bryan Cantrill

La ejecución de los comandos especificados no se produce en el contexto de la activación del sondeo, sino cuando la memoria intermedia que contiene los detalles de la acción system() se procesa a nivel de usuario. El momento y la ubicación en que tiene lugar este procesamiento dependen de la directiva de almacenamiento en memoria intermedia, descrita en el Capítulo 11Memorias intermedias y almacenamiento en memoria intermedia. Con la directiva de almacenamiento en memoria intermedia, la velocidad de procesamiento se especifica mediante la opción switchrate. Puede observar el retraso inherente a system() si ajusta de forma explícita switchrate con un valor superior al valor predeterminado de un segundo, como se muestra en el siguiente ejemplo:

#pragma D option quiet
#pragma D option destructive
#pragma D option switchrate=5sec

tick-1sec
/n++ < 5/
{
	printf("walltime  : %Y\n", walltimestamp);
	printf("date      : ");
	system("date");
	printf("\n");
}

tick-1sec
/n == 5/
{
	exit(0);
}

La ejecución de la secuencia de comandos anterior devuelve una salida similar al siguiente ejemplo:


# dtrace -s ./time.d
 walltime  : 2004 Jul 20 13:26:30
date      : Tue Jul 20 13:26:35 CDT 2004

walltime  : 2004 Jul 20 13:26:31
date      : Tue Jul 20 13:26:35 CDT 2004

walltime  : 2004 Jul 20 13:26:32
date      : Tue Jul 20 13:26:35 CDT 2004

walltime  : 2004 Jul 20 13:26:33
date      : Tue Jul 20 13:26:35 CDT 2004

walltime  : 2004 Jul 20 13:26:34
date      : Tue Jul 20 13:26:35 CDT 2004

Tenga en cuenta que el valor de walltime varía, aunque los valores de date sean idénticos. Este resultado refleja el hecho de que la ejecución del comando date(1) sólo se ha producido cuando se ha procesado la memoria intermedia y no cuando se ha registrado la acción system().