0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>В этой статье мы рассмотрим основы потоков в языке программирования C и разберём соответствующий машинный код. Понимание этого поможет вам в изучении реверс-инжиниринга.</p>
1
<p>В этой статье мы рассмотрим основы потоков в языке программирования C и разберём соответствующий машинный код. Понимание этого поможет вам в изучении реверс-инжиниринга.</p>
2
<p>Итак, наш рабочий код выглядит следующим образом:</p>
2
<p>Итак, наш рабочий код выглядит следующим образом:</p>
3
void *mythread(void *vargp) { // пауза на секунду sleep(1); printf("Hello from my thread\n"); } void Threading() { pthread_t tid; printf("This is before the thread\n"); //создаём новый поток pthread_create(&tid, NULL, mythread, NULL); // присоединяем поток к главному потоку pthread_join(tid, NULL); printf("This is after the thread\n"); }<p>Заметьте, что программа сначала печатает "This is before the thread", далее создаёт новый поток, который, в свою очередь, указывает на функцию *mythread(), задействуя функцию pthread_create(). Когда функция *mythread() завершится (это произойдёт после сна длиной одну секунду), и на экран выведется "Hello from mythread"), то новый поток присоединится к основному посредством функции pthread_join() с последующим выводом на экран "This is after the thread".</p>
3
void *mythread(void *vargp) { // пауза на секунду sleep(1); printf("Hello from my thread\n"); } void Threading() { pthread_t tid; printf("This is before the thread\n"); //создаём новый поток pthread_create(&tid, NULL, mythread, NULL); // присоединяем поток к главному потоку pthread_join(tid, NULL); printf("This is after the thread\n"); }<p>Заметьте, что программа сначала печатает "This is before the thread", далее создаёт новый поток, который, в свою очередь, указывает на функцию *mythread(), задействуя функцию pthread_create(). Когда функция *mythread() завершится (это произойдёт после сна длиной одну секунду), и на экран выведется "Hello from mythread"), то новый поток присоединится к основному посредством функции pthread_join() с последующим выводом на экран "This is after the thread".</p>
4
<p>Что же, теперь самое время посмотреть на машинный код:</p>
4
<p>Что же, теперь самое время посмотреть на машинный код:</p>
5
<p>В первую очередь программа печатает "This is before the thread".</p>
5
<p>В первую очередь программа печатает "This is before the thread".</p>
6
<p>Далее формируется новый поток посредством системного вызова _pthread_create. Данный поток получает в качестве аргумента mythread().</p>
6
<p>Далее формируется новый поток посредством системного вызова _pthread_create. Данный поток получает в качестве аргумента mythread().</p>
7
<p>Как видите, функция mythread() просто спит 1 секунду перед выводом "Hello from mythread".</p>
7
<p>Как видите, функция mythread() просто спит 1 секунду перед выводом "Hello from mythread".</p>
8
<p>Кстати, внутри функции mythread() вы можете заметить 2 нопа - они размещены специально в целях облегчения навигации на этапе подготовки данной статьи.</p>
8
<p>Кстати, внутри функции mythread() вы можете заметить 2 нопа - они размещены специально в целях облегчения навигации на этапе подготовки данной статьи.</p>
9
<p>После своего возврата из функции mythread() новый поток соединится с основным посредством функции _pthread_join.</p>
9
<p>После своего возврата из функции mythread() новый поток соединится с основным посредством функции _pthread_join.</p>
10
<p>В конце концов, на экран выведется "This is after the thread" и произойдёт возврат из функции.</p>
10
<p>В конце концов, на экран выведется "This is after the thread" и произойдёт возврат из функции.</p>
11
<p><em>По материалам статьи<a>"BOLO: Reverse Engineering - Part 2 (Advanced Programming Concepts)"</a></em></p>
11
<p><em>По материалам статьи<a>"BOLO: Reverse Engineering - Part 2 (Advanced Programming Concepts)"</a></em></p>
12
12