c - Tråde/proces sammenligning på Linux/Windows

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har erfaring med at bruge tråde og processer i Windows.


Kan nogen forklare, er der nogen kortlægning muligt tråde og processer i Windows til det samme i Linux?


Det betyder, Threads in Windows == Tråd i Linux? -> Er der nogen mening?
            Process i Windows == Proces i Linus? -> Er der nogen mening?


Hvis det samme, har jeg CreateThread () og CreateProcess () opkald i Windows, hvad er de tilsvarende opkald i Linux?


Jeg har læst nogle indlæg i SO men de fleste af dem har ikke ryddet mine tvivl. Så tænkte de at starte et nyt indlæg.


Det ville være rart Hvis jeg får nogle forklaringer med nogle enkle eksempler (C programmering).

Bedste reference


Nå, der er tilsvarende opfordringer til dit formål i Linux, men de arbejder lidt anderledes, i hvert fald for procesmekanismen.



  1. For tråde kan du bruge pthread\_create. Det fungerer på en meget lignende måde til CreateThread, medmindre nogle parametre er forskellige. Skal være meget nem at bruge. Her er en god tutorial: https://computing.llnl.gov/tutorials/pthreads/[15]

  2. Emulering af CreateProcess for at starte en ekstern proces er ikke så ligetil. Du skal bruge den berømte fork/exec combo. For det første skal du ringe fork i hovedprocessen for at gyde en børneproces. Dette barn er skabt ved at duplikere den oprindelige proces. Du kan derefter styre strømmen ved at tjekke værdien returneret af 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
 }



I grund og grund vil rv være 0 for barnet og pid for barnet for moderen. Jeg håber jeg har ikke mistet dig hidtil. :)


Når du fortsætter, skal du ringe til en af ​​exec familie af funktioner for at starte en ekstern proces:



 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
 }



I ovenstående eksempel starter jeg /bin/ls ekstern proces, som udskriver indholdet af den aktuelle mappe.


Her er et simpelt fyldt eksempel: http://flinflon.brandonu.ca/dueck/2001/62306/Processes/Unix\%20Examples.htm[16]


Nu kan du undre dig over hvorfor du skal ringe fork i første omgang, og hvorfor execl ikke er nok. Dette skyldes, at efter at programmet, der påberåbes af execl, er afsluttet, afsluttes den nuværende proces, og du vil ikke have det i hovedprocessen.