É má prática para usar a função () quando funções de biblioteca pode ser usado em vez do sistema? Por quê?

StackOverflow https://stackoverflow.com/questions/509743

  •  21-08-2019
  •  | 
  •  

Pergunta

Say há alguma funcionalidade necessária para um aplicativo em desenvolvimento que poderia ser conseguido através de uma chamada de sistema, quer um programa de linha de comando ou utilizando uma biblioteca. Assumindo que a eficiência não é um problema, é má prática para simplesmente fazer uma chamada de sistema para um programa em vez de utilizar uma biblioteca? Quais são as desvantagens de se fazer isso?

Para tornar as coisas mais concreto, um exemplo deste cenário seria uma aplicação que precisa baixar um arquivo de um servidor web, ou o programa de cURL ou a biblioteca libcurl poderia ser usado para isso.

Foi útil?

Solução

A menos que você está escrevendo código para apenas um OS, não há nenhuma maneira de saber se a sua chamada de sistema vai mesmo trabalhar. O que acontece quando há uma atualização do sistema ou uma atualização do sistema operacional?
Nunca usar uma chamada de sistema se houver uma biblioteca para fazer a mesma função.

Outras dicas

Eu prefiro bibliotecas por causa do problema de dependência, ou seja, o poder executável não estar lá quando você chamá-lo, mas a biblioteca será (assumindo referências de biblioteca externos se cuidado quando o processo começa em sua plataforma). Em outras palavras, usando bibliotecas parece garantir um mais estável, resultado previsível em mais ambientes do que chamadas de sistema faria.

Há vários factores a ter em conta. Um uma chave é a confiabilidade de se o programa externo estará presente em todos os sistemas onde o software está instalado. Se houver uma possibilidade de que ele vai estar ausente, então talvez seja melhor fazê-lo dentro de seu programa.

Pesando contra isso, você pode considerar que o código extra carregado para o seu programa é proibitivo -. Você não precisa o inchaço código para uma parte tão raramente usada de sua aplicação

A função system () é conveniente, mas perigoso, não menos importante, porque invoca um shell, normalmente. Você pode ser melhor fora chamar o programa mais diretamente - no Unix, através do fork () e chamadas de sistema exec (). [Note-se que uma chamada de sistema é muito diferente de chamar a função system(), aliás!] OTOH, você pode precisar se preocupar com a garantia de todos os descritores de arquivos abertos em seu programa estão fechados - especialmente se o seu programa é algum tipo de daemon rodando em nome outros usuários; que é menos de um problema se você não estiver usando privilégios especiais, mas ainda é uma boa idéia para não dar o acesso ao programa invocado para qualquer coisa que você não tinha a intenção. Você pode precisar de olhar para a chamada de sistema fcntl() ea bandeira FD_CLOEXEC.

Geralmente, é mais fácil manter o controle das coisas, se você construir a funcionalidade em seu programa, mas não é uma decisão trivial.

A segurança é uma preocupação. Uma onda malicioso pode causar estragos em seu programa. Depende se este é um programa pessoal, onde a velocidade de codificação é o seu foco principal, ou uma aplicação comercial onde as coisas como segurança desempenham um fator.

As chamadas do sistema são muito mais difíceis de fazer com segurança.

Todos os tipos de personagens engraçados precisam ser corretamente codificada para passar argumentos em, e os tipos de codificação pode variar por plataforma ou versão ainda do comando. Assim, fazer uma chamada de sistema que contém os dados do usuário em tudo requer um monte de sanidade de verificação e é fácil cometer um erro.

Sim, como mencionado acima, tenha em mente a diferença entre chamadas de sistema (como fcntl () e open ()) e system () chamadas. :)

Nos primeiros estágios de protótipo de um programa c, muitas vezes eu fazer chamadas externas para programas como grep e sed para a manipulação de arquivos usando o popen (). Não é seguro, não é seguro, e certamente não é portátil. Mas pode permitir que você obtenha indo rapidamente. Isso é valioso para mim. Deixa-me concentrar no núcleo muito importante do programa, geralmente a razão que eu usei c em primeiro lugar.

Em linguagens de alto nível, é melhor você ter uma razão muito boa. :)

Em vez de fazer tanto, eu Unix-lo e construir uma estrutura de script em torno de seu aplicativo, usando os argumentos de linha de comando e stdin.

Outras de ter mencionado pontos bons (confiabilidade, segurança, segurança, portabilidade, etc) - mas eu vou jogar fora outra. Atuação. Geralmente, ele é muitas vezes mais rápido para chamar uma função de biblioteca ou até mesmo gerar um novo segmento, em seguida, é começar todo um processo novo (e, em seguida, você ainda tem que corretamente verificar / verificar a sua execução e analisar a sua saída!)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top