Comportamento de processo estranho no Ubuntu virtualizado

1

Estou executando o Ubuntu 14.04 LTS no Windows 8.1 usando o VirtualBox. Estou me aproximando dos sistemas operacionais e o programa a seguir mostra um resultado estranho:

#include <stdio.h>
#include <unistd.h>
int main() {
printf("I'm the parent, my PID is %d, my parent is process %d\n",
getpid(), getppid());
fork();
printf("This sentence has been printed by process: %d my parent is process %d\n",
getpid(), getppid());
return 0;
}     

Eu compilo com o GCC e o executo. Então a saída é a seguinte:

kocks@kocks-VirtualBox:~$ ./uno
I'm the parent, my PID is 3746, my parent is process 3507
This sentence has been printed by process: 3746 my parent is process 3507
kocks@kocks-VirtualBox:~$ This sentence has been printed by process: 3747 my parent is process 2857

O problema é com a terceira frase: Espero que "meu processo pai seja 3746"! Em particular, o número (2857) é sempre o mesmo e só muda depois de reinicializar a VM. Existem alguns pontos a serem adicionados:

  1. Se eu adicionar um wait() antes do retorno, ele funcionará perfeitamente
  2. Quando eu tento "empurar" a VM (como dar a ela dois processadores, mais RAM etc.) ela às vezes e aleatoriamente retorna a saída correta

Então, acho que o problema está na VM, estou certo? Como posso resolver este problema?

EDITAR Ao executar o programa a partir do Ubuntu em dual boot, esta é a saída:

I'm the parent, my PID is 3186, my parent is process 2454 
This sentence has been printed by process: 3186 my parent is process 2454
This sentence has been printed by process: 3187 my parent is process 3186

Como isso é possível?

    
por Filippo Galli 18.04.2015 / 02:41

2 respostas

2

Eu testei isso em 2 configurações de virtualbox, ambas usando o OS X como host, e atribui apenas 1 CPU para cada cliente.

1 Ubuntu 14.04.2

Nesta configuração, no ambiente X window, o comportamento corresponde ao OP

john@U64D:~$ ./a
I'm the parent, my PID is 2682, my parent is process 2632
This sentence has been printed by process: 2682 my parent is process 2632
john@U64D:~$ This sentence has been printed by process: 2683 my parent is process 1673

O processo pai 1673 permanecerá o mesmo até eu fazer logout e login novamente

john@U64D:~$ ./a
I'm the parent, my PID is 3787, my parent is process 3740
This sentence has been printed by process: 3787 my parent is process 3740
john@U64D:~$ This sentence has been printed by process: 3788 my parent is process 3107
./a
I'm the parent, my PID is 3790, my parent is process 3740
This sentence has been printed by process: 3790 my parent is process 3740
john@U64D:~$ This sentence has been printed by process: 3791 my parent is process 3107

3107 é init --user

john@U64D:~$ ps -ef|grep 3107
john      3107  2911  0 15:07 ?        00:00:00 init --user

No entanto, o resultado corresponderá à resposta do Barmar em ambientes não X (por exemplo, tty1).

2 Debian 7.8

Esta configuração correspondeu à resposta do Barmar, tanto para o ambiente X como para o não-X.

john @ debian: ~ $ ./a

I'm the parent, my PID is 3455, my parent is process 3406
This sentence has been printed by process: 3455 my parent is process 3406
john@debian:~$ This sentence has been printed by process: 3456 my parent is process 1

Conclusão

A observação do OP é resultado do Ubuntu usando o init da sessão para o ambiente X padrão. Informações detalhadas sobre o init da sessão podem ser encontradas aqui .

    
por 18.04.2015 / 21:16
1

Se você não usa wait() , o pai pode terminar antes que a criança tenha a chance de correr. No momento em que o processo filho chama getppid() , o pai saiu, então o filho é adotado por init . Em uma implementação normal do Unix, o PID de init é 1, então você esperaria que ele dissesse meu pai é process 1 quando isso acontecer. Mas, aparentemente, o VirtualBox muda isso.

Se você usar wait() , isso fará com que os pais esperem que o filho termine antes de sair. Então a criança nunca se tornará órfã.

    
por 18.04.2015 / 05:32

Tags