Pergunta

Tenho esse problema para resolver que não tenho idéia de como fazê -lo, porque existem apenas algumas chamadas de sistema que podemos usar para resolvê -lo e não vejo como elas são úteis para a situação.

O exercício:
Eu tenho matriz com tamanho [10] [1000000] com números inteiros e para cada linha, crio um novo processo com o Fork (). A idéia de cada processo é passar por todos os números para essa linha específica e encontrar um número específico e imprimir uma mensagem sobre ele. Este foi o primeiro passo do problema e está feito. O segundo passo é imprimir o total de ocorrências desse número em cada linha por ordem. E no final, o grande total de ocorrências desse número.

As chamadas:
As chamadas do sistema que posso usar são descritas assim no documento para este exercício:

  • pid_t fork(void);
  • void exit(int status);
  • pid_t wait(int *status);
  • pid_t waitpid(pid_t pid, int *status, int options);

O problema:
Eu não tenho ideia de como fazer isso porque o exit() A chamada apenas me permite passar um número abaixo de 256, e se o número de ocorrências for maior que esse número? Como devo devolver esse número?

Outro problema:
Eu não entendo exatamente a diferença entre wait() e waitpid() e como/onde usar um sobre o outro. Além das páginas do homem, existem mais documentação em que posso ver exemplos de código e para entendê -los melhor? Ou alguém pode me explicar as diferenças e fornecer um exemplo básico demonstrando essas diferenças?

Foi útil?

Solução

Usar waitpid() Para reunir os status de saída dos processos filhos em sequência; usando wait() Não tem garantia sobre a sequência em que os cadáveres infantis serão recuperados.

No UNIX, o status de saída é limitado a 8 bits, que podem ser tratados como assinados ou não assinados pelo programa, recuperando os dados. Você também obtém um valor de 8 bits identificando o número do sinal e o status de despejo do núcleo da criança terminada. Afaik, o status ou os bits de sinal são sempre zero (e geralmente ambos - quando o processo sai com sucesso).

Se você não sabe que os números a serem devolvidos são menores que 256, o status de saída não é o caminho a seguir. Como outros disseram, você deve usar outro IPC nesse caso. Se as únicas chamadas de sistema permitidas forem essas, você deve concluir que os valores serão inferiores a 255 ou que os transbordamentos não importam. Nem é satisfatório como uma conclusão fora de um exercício de lição de casa, mas no 'mundo real', você também não se limita a apenas 4 chamadas de sistema.

Veja também Códigos de saída maiores que 255?. Observe que no Windows, o intervalo de códigos de saída é muito maior - mas você não usa as chamadas do sistema listadas na pergunta.


Observação: quando eu faço exit(1), o valor no status de wait() é 256; Existe uma razão para isso?

Resposta: Sim. Os 8 bits baixos da palavra de status codificam o número do sinal e assim por diante; Os 8 bits altos da palavra de status (16 bits) codificam o status de saída.

Ver <sys/wait.h> e Macros wifexited (), wexitstatus (), etc.

Outras dicas

Eu acho que o que você está fazendo deve funcionar bem - basta retornar o número de ocorrências como o código de saída do processo.

Você menciona que o exit () permitirá apenas números abaixo de 256. Duvido muito se esse for o caso, mas seria simples o suficiente para você escrever um programa de teste para descobrir com certeza.

Parece que esta é realmente apenas uma versão simplificada de REDUCO DE MAPO. Você pode querer dar uma olhada nesse algoritmo também para algumas idéias sobre como você pode paralalizar ainda mais o programa - e talvez obter algum crédito extra :)

Quanto à diferença entre wait () e waitpid () - se você quiser apenas esperar que algum dos seus processos filhos seja concluído, você usaria Wait (). Se você deseja aguardar apenas um processo infantil específico ou se deseja verificar se um processo filho saiu sem pendurar, você usaria o waitpid ().

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