É std:: sistema ou exec melhor prática?
eu tenho um programa que chama uma ferramenta de script shell que eu fiz que passa por um diretório e fecha arquivos, obtém o valor de checksum e chama algumas outras ferramentas para carregar os arquivos. A operação demora entre 3 e 4 minutos.
Eu chamo o guião assim:int result = system("/bin/sh /path/to/my/script");
eu também tenho o mesmo resultado usando a família de funções exec()
:
int child = fork();
if(child == 0) {
execl( "/bin/sh", "sh", "/path/to/my/script", (char*)0 );
}
Eu sei que com exec
você pode redireccionar o resultado para o programa pai para que ele possa ler o resultado da linha de comandos ferramentas, mas para além disso quando deve utilizar system
em vez de exec
?
2 answers
Ignorando por enquanto que o uso de {[[0]} é portátil enquanto o uso de exec
família de funções não é portátil...
Quando combina a utilização de exec
família de funções com outras funções POSIX, tais como:pipe
, dup
, wait
, você tem muito mais controle sobre como passar dados entre o processo pai e o processo filho.
Quando você não precisa de nenhum desses controles, ou seja, você só quer executar um comando, então usar {[[0]} é preferível, IMO.
O primeiro system
chamado em sua pergunta vai fazer o mesmo, o que você está fazendo no próximo pedaço de código (fork e execl) {[[4]}
Da documentação:
The system() library function uses fork(2) to create a child process
that executes the shell command specified in command using execl(3)