2012-03-20 19 views
5

Mam pewne doświadczenie w używaniu wątków i procesów w systemie Windows.Wątki/Porównanie procesów w systemie Linux/Windows

Czy ktoś może wyjaśnić, czy istnieje możliwość mapowania wątków i procesów w systemie Windows w systemie Linux?

To znaczy, wątki w Windows == Wątki w Linuksie? -> Czy ma sens? Proces w Windows == Proces w Linusie? -> Czy ma sens?

Jeśli takie same, mam wywołania CreateThread() i CreateProcess() w oknach, jakie są równoważne wywołania w systemie Linux?

Czytałem niektóre posty w SO, ale większość z nich nie oczyściła moich wątpliwości. Więc pomyślałem o rozpoczęciu nowego postu.

Byłoby miło, jeśli otrzymam wyjaśnienie na kilka prostych przykładów (programowanie C).

+2

Sprawdź ['pthread_create'] (http://linux.die.net/man/3/pthread_create) i [' fork'] (http://linux.die.net/man/2/fork) dzwoni w Linuksie. –

+1

I nie oczekuj równoważności między wywołaniami systemu Linux i Windows. Pojęcia i terminologia są nieco inne. –

+0

Cóż, ściśle, Linux nie ma wątków, zna tylko procesy, a ostatnio procesy dzielące przestrzeń adresową i/lub deskryptory plików. Ponadto nigdy nie tworzy nowych procesów, tylko robi ich kopie. O ile nawet podobne lub identyczne wyniki końcowe można osiągnąć, nie ma prawdziwej korespondencji 1: 1 w działaniu. – Damon

Odpowiedz

6

Cóż, istnieją równoważne połączenia dla twojego celu w Linuksie, ale działają trochę inaczej, przynajmniej dla mechanizmu procesu.

  1. Dla wątków, można użyć pthread_create. Działa w sposób bardzo podobny do CreateThread, z tym że niektóre parametry są różne. Powinien być bardzo łatwy w użyciu. Oto dobry samouczek: https://computing.llnl.gov/tutorials/pthreads/

  2. Emulowanie CreateProcess w celu rozpoczęcia procesu zewnętrznego nie jest tak proste. Będziesz potrzebował słynnego kombinatu fork/exec. Najpierw musisz zadzwonić pod numer fork w głównym procesie, aby odrodzić proces potomny. To dziecko powstaje przez powielenie początkowego procesu. Następnie można kontrolować przepływ sprawdzając wartość zwróconą przez fork:

int rv = fork(); 
// new process was spawned here. The following code is executed 
// by both processes. 
if(rv == 0) 
{ 
    // we are in the child process 
} 
else 
{ 
    // we are in the parent 
} 

Zasadniczo rv będzie 0 dla dziecka i pid dziecka do rodzica. Mam nadzieję, że do tej pory cię nie straciłem. :)

Idąc dalej, trzeba będzie zadzwonić do jednego z rodziny funkcji exec aby rozpocząć proces zewnętrzne:

int rv = fork(); 
// new process was spawned here. The following code is executed 
// by both processes. 
if(rv == 0) 
{ 
    execl("/bin/ls", "ls", NULL); // start the ls process 
} 
else 
{ 
    // we are in the parent 
} 

w powyższym przykładzie, jestem rozpoczęciem /bin/ls zewnętrzny proces, który drukuje zawartość bieżącego folderu.

Oto prosty pełny przykład: http://flinflon.brandonu.ca/dueck/2001/62306/Processes/Unix%20Examples.htm

Teraz można się zastanawiać, dlaczego trzeba zadzwonić fork na pierwszym miejscu i dlaczego execl nie wystarczy. Dzieje się tak dlatego, że po zakończeniu programu wywołanego przez execl, bieżący proces również zostanie przerwany, a Ty nie chcesz, aby stało się to w procesie głównym.

+0

Dzięki .... Dobra odpowiedź. –

+0

: Nie można rozpocząć nowego procesu od razu po zwrocie widelca(). Mam na myśli, że nie musimy wykonywać następnej linii po fork(), jeśli możemy przekazać plik wykonywalny do zrobienia jako część widelca, to byłoby logiczne, tak jak w przypadku createProcess w oknach? –

+0

@Renjith G: Obawiam się, że nie. 'fork' nie przyjmuje żadnych parametrów. Jego jedynym celem jest skopiowanie obecnego procesu do nowego. 'fork/exec' jest standardowym sposobem linuxa do uruchamiania zewnętrznego procesu. – Tudor

Powiązane problemy