A função system() em C++
-
Use a função
system()
em C++ para executar o comando Shell de execução -
Use
system(nullptr)
para verificar se o Shell está disponível no sistema -
Use macros
wstatus
para verificar o status do comando executado
Este artigo demonstrará vários métodos de uso de uma função de biblioteca - system()
em C++.
Use a função system()
em C++ para executar o comando Shell de execução
A função system()
faz parte da biblioteca padrão C há algum tempo e também pode ser incluída no código C++ sem bibliotecas extras. A função é usada para executar um comando shell do processo de chamada. Observe, porém, que system
é criado para casos de uso especiais quando o programa de chamada precisa gerar um único processo filho e imediatamente começar a aguardar seu término. Portanto, a função em si é implementada com várias chamadas de sistema que estão disponíveis como parte da interface do sistema.
Se assumirmos o ambiente UNIX, o usuário não terá que lidar diretamente com as funções fork
, exec
e wait
que controlam a criação / limpeza de um novo processo. O exemplo a seguir demonstra o caso de uso mais simples para a função system
, que executa o utilitário de linha de comando ls
para imprimir os arquivos no diretório de trabalho atual.
#include <iostream>
int main() {
system("ls");
return EXIT_SUCCESS;
}
A função system()
geralmente cria dois processos para executar um único comando. Ou seja, ele cria um shell com uma chamada exec
e outra para o comando fornecido que o shell executará. Afeta negativamente o desempenho em relação ao uso direto das chamadas de sistema subjacentes. Observe que se executarmos o comando top
com system
, o programa está esperando até que o usuário saia de top
manualmente, o que retornará no processo de chamada e o forçará a mover para a instrução return
conforme mostrado no seguinte exemplo.
#include <iostream>
int main() {
system("top");
return EXIT_SUCCESS;
}
Use system(nullptr)
para verificar se o Shell está disponível no sistema
A função system()
aceita uma única cadeia de caracteres como argumento, que é o comando que precisa ser executado a partir do shell. Se passarmos nullptr
ou NULL
, um valor diferente de zero é retornado quando um programa de shell está disponível no sistema, ou se o zero é retornado, indica que o shell não está disponível.
#include <iostream>
#include <string>
using std::cout;
using std::endl;
int main() {
auto ret = system(nullptr);
if (ret != 0)
cout << "shell is available on the system!" << endl;
else
cout << "shell is not available on the system!" << endl;
return EXIT_SUCCESS;
}
Resultado:
shell is available on the system!
Use macros wstatus
para verificar o status do comando executado
Se a chamada system
falhar em criar um processo filho, ela retorna -1
e define errno
de acordo. Se a chamada da função for bem-sucedida, o valor de retorno é o código de status de terminação do shell que executou o comando fornecido. Além disso, esse código de status de encerramento é igual ao código de saída do último comando executado. Assim, pode-se examinar seu valor usando as macros wstatus
descritas na chamada do sistema wait
página man. O próximo trecho de código implementa uma função printWaitStatus
para verificar o valor de retorno do system
e imprimir os detalhes sobre o último comando que foi executado.
#include <cstring>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
void printWaitStatus(const char *msg, int status) {
if (msg != nullptr) printf("%s", msg);
if (WIFEXITED(status)) {
printf("child exited, status=%d\n", WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
printf("child killed by signal %d (%s)", WTERMSIG(status),
strsignal(WTERMSIG(status)));
#ifdef WCOREDUMP
if (WCOREDUMP(status)) printf(" (core dumped)");
#endif
printf("\n");
} else if (WIFSTOPPED(status)) {
printf("child stopped by signal %d (%s)\n", WSTOPSIG(status),
strsignal(WSTOPSIG(status)));
#ifdef WIFCONTINUED
} else if (WIFCONTINUED(status)) {
printf("child continued\n");
#endif
} else {
printf("status=%x\n", (unsigned int)status);
}
}
int main() {
auto ret = system("ls");
if (ret == -1)
cout << "a child process could not be created, or"
"its status could not be retrieved!"
<< endl;
else
printWaitStatus(nullptr, ret);
return EXIT_SUCCESS;
}
Resultado:
(ls command output)
...
child exited, status=0
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook