2012-03-20 2 views
5

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

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

Это означает, что Темы в Windows == Темы в Linux? -> Имеет смысл? Процесс в Windows == Процесс в Linus? -> Имеет смысл?

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

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

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

+2

Посмотрите ['pthread_create'] (http://linux.die.net/man/3/pthread_create) и [' fork'] (http://linux.die.net/man/2/fork) вызывает в Linux. –

+1

И не ожидайте эквивалентности между системными вызовами Linux и Windows. Понятия и терминология несколько отличаются. –

+0

Ну, строго говоря, Linux не имеет потоков вообще, он знает только процессы, а в последнее время - процессы, которые совместно используют адресное пространство и/или дескрипторы файлов. Также он никогда не создает новых процессов, он только делает их копии. Если даже если аналогичные или идентичные конечные результаты могут быть достигнуты, нет реального соответствия 1: 1 в том, как работает материал. – Damon

ответ

6

Ну, в 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 для ребенка и ИДП ребенка для родителей. Надеюсь, я до сих пор не потерял тебя. :)

Двигаясь дальше, вам нужно позвонить в один из 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, текущий процесс также завершается, и вы не хотите, чтобы это произошло в основном процессе.

+0

Спасибо .... Хороший ответ. –

+0

: Невозможно запустить новый процесс, как только вернем fork(). Я имею в виду, что нам не нужно выполнять следующую строку после fork(), если мы сможем передать исполняемый файл порожденной как часть вилки, это было бы логично правильно, как createProcess в windows? –

+0

@Renjith G: Боюсь, нет. 'fork' не принимает никаких параметров. Единственная цель - дублировать текущий процесс на новый. 'fork/exec' - стандартный способ linux запуска внешнего процесса. – Tudor

Смежные вопросы