/ / Obtención de un entero (mayor que 255) de la función del sistema en C ++ - c ++, bash, return, system

Obtención de un entero (mayor que 255) de la función del sistema en C ++ - c ++, bash, return, system

Tengo un problema relativamente simple que parece que no puedo hacer. Lo que necesito hacer es recuperar un número entero de un script de bash usando el system Funciona en un programa de C ++. Mi entendimiento es que system por defecto devuelve un entero, por lo que debería ser bale para hacer algo como

int returnedVal = system ("myscript");

Sin embargo, el principal problema es bash scripts notiene valores de retorno, solo una bandera entre 0 y 255 para que tengan o no éxito. He intentado hacer algo como escribir en un archivo de texto en la secuencia de comandos y luego leer en un archivo, sin embargo, esto causó algunos problemas y me gustaría evitarlo si es posible. ¿Alguien sabe la forma más fácil de hacer esto? Muchas gracias de antemano.

Respuestas

3 para la respuesta № 1

La salida POSIX (3) dice:

El valor del estado puede ser 0, EXIT_SUCCESS,EXIT_FAILURE, [CX] [Opción Inicio] o cualquier otro valor, aunque solo los 8 bits menos significativos (es decir, estado y 0377) estará disponible para un padre en espera proceso.

Esto significa que ningún valor superior al que se puede representar con 8 bits puede salir de una terminación de proceso normal mediante una llamada a exit entonces los padres no pueden atrapar más.

Más sobre esto. No utilice el valor devuelto para transmitir algunos datos, principalmente está destinado a representar un estado de éxito o error. 0 valor representa exitoso, cualquier otro error.

Si desea que sus procesos comuniquen algo, entonces necesita algún canal de comunicación (archivo, canalización, etc.).


1 para la respuesta № 2

Si myscript -como muchos guiones o programas- escribir (2)-s algo (por ejemplo, algunos números o cadenas) en su stdout, puede usar (en POSIX) popen (3) en tu programa Cuando tenga exito popen daría un FILE* transmisión para <stdio.h> rutinas (que se pueden leer con fscanf etc).

(Supongo que está utilizando algún sistema Linux o POSIX)

Pero sistema (3) atrapa el salida (3) estado (en realidad también otras terminaciones, por ejemplo, señal (7)-s, ver waitpid (2)) de myscript. No se preocupa por la salida de myscript que se inserta en la salida estándar de su programa.

No te olvides de usar pclose (3) (no fclose) para cerrar eso popenCorriente Lee tambien tubo (7).

Por ejemplo, este código lee el número de la salida del wc -l /etc/fstab mando

FILE*p = popen("wc -l /etc/fstab", "r");
if (!p) { perror("popen"); exit(EXIT_FAILURE); };
int n= 0;
if (fscanf(p,"%d", &n)<=0) { perror("fscanf"); exit(EXIT_FAILURE; };
if (pclose(p)>0) /*wc failed*/ exit(EXIT_FAILURE);
printf("your fstab has %d linesn", n);

Deberias leer Programación avanzada de Linux (Descargable gratuitamente). Es posible que desee utilizar otras cosas (por ejemplo, algunas llamadas al sistema como fork (2), execve (2), waitpid (2), pipe (2), dup2 (2); consulte syscalls (2))

Hay muchas otras formas de hacer algunas Comunicación entre procesos, incluyendo quince (7)-s y casquillo (7)-s.

Cuidado con inyección de código cuando corres, con popen o system, algunos computado cadena que contiene un comando.

Algunas bibliotecas (notablemente Qt o POCO para C ++) ofrece otras formas de ejecutar programas y comunicarse con ellos.


0 para la respuesta № 3

los system página man Dice, luego de discutir todo tipo de fallas:

Si todas las llamadas del sistema tienen éxito, entonces la devoluciónvalor es el Estado de terminación del shell hijo utilizado para ejecutar el comando. (El estado de terminación de un shell es el estado de terminación de El último comando que ejecuta.

Para mayor claridad, se puede agregar que el valor de salida de la concha es el argumento numérico a la exit comando, o, si no se encuentra ninguno, el estado de salida del último comando que se ejecutó, es decir, el valor de $?. Ese valor de salida es pasado por el sistema operativo a la matriz del shell (que puede ser otro shell) a través de waitpid() función. De esa manera, el estado de salida del proceso "hoja" se propaga hasta que alcanza system, y finalmente tu programa.

No veo por qué lo que quieres hacer no debería ser posible.