Red de conocimiento informático - Material del sitio web - Cómo llamar comandos de shell en lenguaje C

Cómo llamar comandos de shell en lenguaje C

1.system (ejecutar comando de shell)

Funciones relacionadas fork, execve, waitpid, popen

Archivo de encabezado #include

Definición de funciones int system(const char * string);

Descripción de la función system() llamará a fork() para generar un proceso hijo, que llamará a /bin/sh-c

string Ejecutar el comando representado por el parámetro de cadena y regresar al proceso original después de ejecutar el comando. Durante una llamada al sistema(), la señal SIGCHLD se reservará temporalmente

, mientras que las señales SIGINT y SIGQUIT se ignorarán.

Valor de retorno Si la llamada a /bin/sh falla, System() devolverá 127; si se debe a otros motivos de falla, devolverá -

1; La cadena del parámetro es Un puntero nulo (NULL) devuelve un valor distinto de cero. Si la llamada al sistema ()

tiene éxito, se devuelve el valor de retorno de ejecutar el comando de shell, pero el valor de retorno

puede ser el mismo que el 127 devuelto después del sistema ( ) la llamada de /bin/sh falla. Los valores son los mismos, por lo que es una buena idea volver a verificar

errno para asegurarse de que la ejecución fue exitosa.

Notas adicionales No utilice system() al escribir programas con permisos SUID/SGID. system() hereda variables de entorno, lo que puede causar problemas de seguridad del sistema.

Ejemplo:

#include

main()

{

sistema( "ls -al /etc/passwd /etc/shadow") ;

}

2.popen (construir E/S de canalización)

Canalización de funciones relacionadas , mkfifo, pclose, fork, system, fopen

Archivo de encabezado #include

Función ARCHIVO * popen( const char * comando, const char * tipo); /p>

Descripción de la función popen() llama a fork() para generar un proceso hijo y luego llama a /bin/sh -c desde el proceso hijo

para ejecutar el comando con el parámetro comando. El tipo de parámetro puede ser "r" para lectura y "w" para escritura.

Dependiendo del valor del tipo, popen() crea una tubería para la salida estándar del proceso hijo o el dispositivo de entrada estándar y devuelve un puntero al archivo. Luego, el proceso puede usar el puntero del archivo para leer datos del dispositivo de salida del proceso hijo o escribir datos en el dispositivo de entrada estándar del proceso hijo

. Además, todas las funciones relacionadas con los punteros de archivos (FILE*) están disponibles

excepto fclose().

Valor de retorno El puntero del archivo se devuelve si tiene éxito; de lo contrario, se devuelve NULL y el motivo del error se almacena en errno.

Código de error EINVAL El tipo de parámetro es ilegal.

Notas Evite el uso de popen() cuando escriba programas con permisos SUID/SGID.

popen()

Hereda variables de entorno, lo que puede causar problemas de seguridad del sistema.

Ejemplo:

#include

main()

{

ARCHIVO * fp;

búfer de caracteres[80];

fp=popen("cat /etc/passwd", "r");

fgets(búfer, sizeof(buffer),fp);

printf("%s ",buffer);

pclose(fp);

}

raíz ejecutiva:x:0 0: raíz:/raíz:

# include

main()

{

char * argv[ ]={"ls","-al"."/etc/passwd",(char*) };

if(vfork() = =0)

{

execv("/bin/ls",argv);

}else{

printf(" Este es el proceso padre\n");

}

}

}

}

}

}

}