Posix Spawn com programação C

Posix Spawn com programação C
Spawn é uma função usada no POSIX para carregar e executar processos infantis. O processo atualmente em execução no POSIX continuará ou não continuará a executar esses processos infantis e outros processos de forma assíncrona. Sempre que um novo subprocesso é criado, ele requer alguma memória específica que permitirá que o processo dos pais e da criança seja executado. No Microsoft Windows, UNIX e Linux, há uma certa família de geradores; E outras famílias de funções de gerar são consideradas uma extensão opcional.

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.