Spawn (computação) - Spawn (computing)
Spawn em computação refere-se a uma função que carrega e executa um novo processo filho . O processo atual pode esperar que a criança termine ou pode continuar a executar computação simultânea . A criação de um novo subprocesso requer memória suficiente na qual o processo filho e o programa atual podem ser executados.
Existe uma família de funções de spawn no DOS , herdada pelo Microsoft Windows .
Também existe uma família diferente de funções de spawn em uma extensão opcional dos padrões POSIX .
Funções de geração do DOS / Windows
As funções de spawn do DOS / Windows são inspiradas nas funções fork e exec do Unix ; entretanto, como esses sistemas operacionais não suportam fork, a função spawn foi fornecida como um substituto para a combinação fork-exec. No entanto, a função de spawn, embora trate adequadamente dos casos de uso mais comuns, carece de todo o poder do fork-exec, uma vez que após o fork, quaisquer configurações de processo que sobreviverão a um exec podem ser alteradas. No entanto, na maioria dos casos, essa deficiência pode ser compensada usando a API CreateProcess de nível mais baixo.
Nas chamadas spawnl , spawnlp , spawnv e spawnvp , o processo filho herda o ambiente do pai. Os arquivos que são abertos quando uma chamada de spawn é feita permanecem abertos no processo filho.
Protótipo
int spawnl(int mode, char *path, char *arg0, ...);int spawnle(int mode, char *path, char *arg0, ..., char ** envp);int spawnlp(int mode, char *path, char *arg0, ...);int spawnlpe(int mode, char *path, char *arg0, ..., char ** envp);int spawnv(int mode, char *path, char **argv);int spawnve(int mode, char *path, char **argv, char ** envp);int spawnvp(int mode, char *path, char **argv);int spawnvpe(int mode, char *path, char **argv, char ** envp);
Nomes de funções
O nome base de cada função é gerado , seguido por uma ou mais letras:
| Carta | Notas |
|---|---|
| eu | Os argumentos da linha de comando são passados individualmente para a função. |
| v | Os argumentos da linha de comando são passados para a função como uma matriz de ponteiros. |
| p | Usa a variável de argumento PATH para encontrar o arquivo a ser executado. |
| e | Uma matriz de ponteiros para argumentos de ambiente é passada explicitamente para o processo filho. |
Modo
O argumento mode determina a maneira como o filho é executado. Os valores para o modo são:
| Nome | Notas |
|---|---|
| P_OVERLAY | Sobrepõe o processo pai com o filho, o que destrói o pai. Isso tem o mesmo efeito que as funções exec *. |
| P_WAIT | Suspende o processo pai até que a execução do processo filho termine (geração síncrona). |
| P_NOWAIT, P_NOWAITO | Continua a executar o processo de chamada simultaneamente com o novo processo (geração assíncrona). |
| P_DETACH | a criança é executada em segundo plano sem acesso ao console ou teclado. As chamadas para _cwait após o novo processo falharão (geração assíncrona) |
Caminho
O argumento path especifica o nome do arquivo do programa a ser executado. Somente para spawnlp e spawnvp , se o nome do arquivo não tiver um caminho e não estiver no diretório atual, a variável de ambiente PATH determinará em quais diretórios pesquisar o arquivo. A string apontada por argv [0] é o nome do programa a ser executado.
A linha de comando passada ao programa gerado é composta de cadeias de caracteres, de arg0 a argn , na chamada de geração . O comprimento máximo combinado dessas strings difere entre os compiladores, variando de 128 caracteres no Digital Mars a 1024 no Microsoft Visual C ++ ou tanto quanto a memória permitir, no DJGPP. O último argumento após argn deve ser um ponteiro NULL.
argv
O argumento argv é uma matriz de ponteiros de caracteres. O último ponteiro na matriz deve ser nulo para indicar o final da lista.
envp
As chamadas spawnle , spawnlpe , spawnve e spawnvpe permitem que o usuário altere o ambiente do processo filho passando uma lista de configurações de ambiente no argumento envp . Este argumento é uma matriz de ponteiros de caracteres; cada ponteiro (exceto o último) aponta para uma string terminada em nulo que define uma variável de ambiente. Uma variável de ambiente tem a forma:
name=value
onde nome é o nome da variável e valor é seu valor. O último ponteiro da matriz é nulo. Quando o argumento envp é nulo, o filho herda as configurações de ambiente do pai.
No Microsoft Windows, as funções de spawn * usam LoadModule para executar o processo de spawn ; e se isso falhar, será feita uma tentativa de gerar um processo normal do MS-DOS. Se um aplicativo do Windows for gerado, o identificador da instância pode ser obtido usando exec_instancehandleget . É possível especificar como o programa gerado será mostrado usando as funções _exec_showset , _exec_showget e _exec_showreset .
Valores de retorno
O valor de retorno indica o status de saída do programa gerado. Um valor zero indica que o programa gerado foi executado com sucesso. Um valor positivo indica que o programa gerado foi executado, mas foi abortado ou finalizado com erro, o valor retornado é o status de saída do processo filho. Um valor negativo indica que o programa gerado não foi executado e errno está definido. No Microsoft Windows, o spawn retorna o código de erro negado retornado do LoadModule para compatibilidade com a biblioteca de tempo de execução C. Os seguintes códigos de erro podem ser encontrados:
| Valor | Notas |
|---|---|
-2 |
Arquivo não encontrado |
-3 |
Caminho não encontrado |
-11 |
Arquivo .exe inválido (para Windows) |
-13 |
Aplicativo DOS 4. 0 |
-14 |
Tipo de .exe desconhecido (pode ser estendido para DOS) |
Funções de spawn POSIX
O e seu irmão posix_spawnppodem ser usados como substitutos para fork e exec , mas não fornecem a mesma flexibilidade de usar forke execseparadamente. Eles podem ser substitutos eficientes para forke exec, mas seu propósito é fornecer primitivas de criação de processos em ambientes integrados onde forknão é suportado devido à falta de tradução dinâmica de endereços .
História
A metáfora de desova , ou seja, produzir descendência como na deposição de ovos, teve seu uso inicial no sistema operacional VMS, agora OpenVMS (1977). Na academia, existia um debate animado entre os proponentes do fork do Unix (cópia bruta do layout da memória, mas rápido) e o spawn do VMS (construção confiável de parâmetros de processo, mas mais lento). Esse debate reviveu quando o mecanismo de geração do VMS foi herdado pelo Windows NT (1993).