Por que usar Posix Spawn?
O posix_spawn () e posix_spawnp () As funções são usadas para criar um novo processo infantil. O processo filho então executa um arquivo. Essas funções foram especificadas pelo POSIX para padronizar o método de criar novos processos para máquinas que não possuem suporte. Essas máquinas geralmente são pequenas e não têm os sistemas incorporados para suporte a LMMU.
As duas funções combinam o garfo e o executivo, com algumas etapas adicionais que executarão a criança. Eles atuam como um subconjunto de funcionalidades, geralmente alcançados com um garfo, para todas as chamadas do sistema e sistemas incorporados que não têm essa funcionalidade.
Exemplo 1: Posix_spawn ()
Neste exemplo, usaremos a função Spawn () para criar e executar um novo processo infantil. Então, explicaremos todos os argumentos relevantes usados na função.
Os argumentos usados no exemplo são os seguintes:
Argumento | Descrição |
---|---|
Usado para definir todas as operações de realização de Spawn. | |
caminho | O nome do caminho que deve ser executado. |
fd_count | O número de entradas com a matriz de fd_map. Se fd_count for igual a 0, o FD_MAP será ignorado. Nesses casos, o processo filho herda todos os descritores de arquivos, ignorando os que foram modificados. |
fd_map | Uma variedade de descritores de arquivos a ser herdada pelo processo infantil. Aqui, se o valor de fd_count não for 0, é necessário FD_MAP para trazer os descritores de arquivo fd_count até um valor supremo de open_max. Tem: · A entrada do processo infantil · A saída · Os valores de erro |
herdar | A herança da estrutura mostra que os usuários querem que seu processo infantil herde tudo, desde os pais. |
argv | O ponteiro para um determinado vetor de argumento. O valor argv [0] não pode ser nulo e deve ser o nome do arquivo que está sendo carregado. O valor de argv não pode ser igual a nulo. |
Envp | Aponta para uma variedade de ponteiros de personagem. Cada um dos ponteiros nesta matriz aponta para uma variável de ambiente. O ponto de acabamento da matriz é um ponteiro nulo. |
Exemplo 2: teste.c
No exemplo seguinte, um novo processo infantil é criado para executar o comando por /bin/sh -c. Este é o valor passado como o primeiro argumento. O teste.c O código é o seguinte:
No exemplo acima, chamamos as bibliotecas e depois chamamos de Spawn.h cabeçalho. Você também verá o posix_spawn () chamado para criar um processo infantil no exemplo acima. O Spawn e Spawnp funções são usadas no lugar do garfo e exec funções. Spawn () tem flexibilidade e proporciona muita facilidade para os usuários de várias maneiras. É um pouco diferente de sistema() e exec (). Ele retornará e criará o novo processo infantil. Em nosso exemplo, é PID. Acima, você pode ver que a função de espera waitpid (), então sistema() é usado. Observe que o Spawn () e garfo() Os processos de chamada são os mesmos, e o método de implementação é mais ou menos o mesmo para as duas funções.
Vamos agora executar o exemplo usando um GCC compilador. Você também pode usar qualquer outro compilador de sua escolha:
$ sudo gcc teste.C -lrt
Em seguida, execute o seguinte:
$ ./a.fora
A saída do comando acima parecerá o seguinte:
A criança PID será criado, como você pode ver na saída acima.
Biblioteca
Libc: Use o -l c para vincular o GCC compilador. Aqui, observe que esta biblioteca está incluída automaticamente.
Spawn ()
O Spawn () A função é baseada no Posix 1003.Padrão de rascunho 1D usado como posix_spawn (). A biblioteca C inclui funções de Spawn*(). Aqui, listaremos alguns sufixos, juntamente com suas descrições:
e: usado como uma matriz para variáveis de ambiente.
eu: usado como uma lista de terminado nulo dos argumentos usados dentro do programa.
P: usado para definir um caminho relativo. Se o caminho não tiver uma barra em seu valor, o sistema usa e pesquisa a variável de ambiente do caminho para qualquer programa semelhante.
v: atua como um vetor de argumentos dentro do programa.
Descritores de arquivo de mapeamento
Em Spawn (), nós praticamos o fd_count e fd_map Argumentos para chamar os descritores de arquivo. Especifica qual criança herdar.
O número usado como descritor de arquivo para o processo filho depende de sua localização dentro do fd_map. Aqui, consideraremos o exemplo dos pais com descritores de arquivos avaliados 1, 3 e 5, então o mapeamento será algo assim:
>> int fd_map = 1, 3, 5;
Para a criança | Para o pai |
---|---|
0 | 1 |
1 | 3 |
2 | 5 |
Observe que se você estiver usando o explícito fd_map Para combinar esses descritores de arquivo com a criança e o pai, você deve mapear o Spwan_fdclose função para prosseguir.
Sinalizadores de herança
Em Spawn, os usuários precisam chamar qualquer uma das seguintes bandeiras em caso de herança. Alguns exemplos de bandeiras de desova e suas descrições são dadas abaixo:
Bandeira | Descrição |
---|---|
Spawn_align_default | Esta bandeira é usada para configurar as configurações padrão da configuração para alinhamento. |
Spawn_align_fault | Esta bandeira é usada para desalinhamento de falha das referências de dados. |
Spawn_align_nofault | Esta bandeira é usada para corrigir o desalinhamento da falha. |
Spawn_debug | Esta bandeira é usada para depurar o kernel. |
Spawn_exec | Spawn age como EXEC*() usando esta bandeira. |
Spawn_explicic_cpu | Esta bandeira é usada para definir a máscara de corrida e herdar o membro da máscara da máscara = run. |
Spawn_explicic_sched | Esta bandeira é usada para definir a política de agendamento. |
O <Spawn.h> define essa máscara Spawn_align_mask usado para alinhar as bandeiras listadas acima.
pid_t pgroup | O Grupo de Processos Infantis se você especificar o Spawn_setGroup no membro da bandeira. |
Int RunMask | A máscara de corrida do processo infantil para herdar as máscaras que são acordadas com base no valor deste membro. |
sigset_t sigmask | A máscara de sinal para o processo infantil usado para especificar o status dos membros da bandeira. |
sigset_t sigdefault | O conjunto dos processos infantis dos sinais padrão. |
Erros
O posix_spawn () e posix_spawnp () As funções também podem falhar em alguns casos, como as seguintes:
Einval: É o caso quando o valor identificado por file_actions ou attp não está correto e adequado.
Quando o garfo subjacente (2), o garfo (2) ou o clone (2) a chamada falha, o Spawn () As funções retornarão um número de erro.
Enosys: É esse o caso se a função e seu suporte não for incluídos ou fornecidos em um sistema.
Conclusão
Este tutorial cobriu as funcionalidades básicas fornecidas por Posix_spawn () e as funções usadas por ele para executar e executar suas funções. Também cobrimos as bandeiras e erros comumente usados por Spawn.