Темы / Сравнение процессов в Linux / Windows - PullRequest
5 голосов
/ 20 марта 2012

У меня есть некоторый опыт использования потоков и процессов в Windows.

Может кто-нибудь объяснить, возможно ли какое-либо отображение потоков и процессов в Windows на одно и то же в Linux?

Что значит, Потоки в Windows == Потоки в Linux? -> Есть ли смысл? Процесс в Windows == Процесс в Линусе? -> Есть ли смысл?

Если то же самое, у меня есть вызовы CreateThread () и CreateProcess () в Windows, каковы эквивалентные вызовы в Linux?

Я прочитал несколько постов в SO, но большинство из них не развеяло мои сомнения. Так что подумал начать новый пост.

Было бы неплохо, если бы я получил некоторые объяснения с некоторыми простыми примерами (программирование на C).

1 Ответ

6 голосов
/ 20 марта 2012

Ну, в Linux есть эквивалентные вызовы для вашей цели, но они работают немного по-другому, по крайней мере, для механизма процессов.

  1. Для потоков вы можете использовать pthread_create. Он работает очень похоже на CreateThread, за исключением того, что некоторые параметры отличаются. Должно быть очень простым в использовании. Вот хороший учебник: https://computing.llnl.gov/tutorials/pthreads/

  2. Эмуляция CreateProcess для запуска внешнего процесса не так проста. Вам понадобится знаменитая комбо fork/exec. Во-первых, вам нужно вызвать fork внутри основного процесса, чтобы вызвать дочерний процесс. Этот дочерний элемент создается путем дублирования начального процесса. Затем вы можете управлять потоком, проверяя значение, возвращаемое 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
 }

В основном rv будет 0 для ребенка и pid ребенка для родителя. Я надеюсь, что я не потерял тебя до сих пор. :)

Для продолжения вам потребуется вызов одной из функций семейства exec, чтобы запустить внешний процесс:

 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
 }

В приведенном выше примере я запускаю внешний процесс /bin/ls, который печатает содержимое текущей папки.

Вот простой пример: http://flinflon.brandonu.ca/dueck/2001/62306/Processes/Unix%20Examples.htm

Теперь вы можете задаться вопросом, зачем вам сначала звонить fork и почему execl недостаточно. Это связано с тем, что после завершения программы, вызванной execl, текущий процесс также прекращается, и вы не хотите, чтобы это происходило в основном процессе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...