Однопоточная программа выполняется в нескольких потоках?[С] - PullRequest
0 голосов
/ 14 февраля 2019

Если я выполняю следующий код, который является однопоточным:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
  char[] cmd1 = "cat /sys/class/thermal/thermal_zone0/temp > temp.txt";
  char[] cmd2 = "cat /sys/class/thermal/thermal_zone2/temp > temp2.txt";
  system(cmd1);
  system(cmd2);
  return 0;
}

Я предполагал, что вышеупомянутый код является однопоточным приложением пользовательского уровня.Когда программа выполняется, особенно функция system (), которая требует выполнения команды оболочки.Так, когда эта программа вызывает две командные функции оболочки, они выполняются в двух разных потоках (поток для этой программы и другой поток, выполняемый оболочкой)?Или когда вызывается функция system (), операция передает управление оболочке, которая затем выгружается, выполняет команду и затем возвращает операцию потоку программы?

Может кто-нибудь сказать мне, как вышеупомянутый код работает на уровне потока?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

В Linux потоки и процессы похожи - они называются задачами.В Linux поток - это просто процесс, разделяющий несколько вещей с другими процессами.Вызов функции system() является блокирующим, и ваша программа ожидает, когда system() завершит свою работу.system() создает новый процесс, который завершается при завершении работы.

Можно сказать, что всего три процесса были созданы последовательным способом.Но поскольку между процессами не было ничего общего - они не были потоками.

0 голосов
/ 14 февраля 2019

Контекст функции system () означает, что основной процесс порождает дочерний процесс только для немедленного ожидания его завершения.Таким образом, мы можем думать, что system () = fork () -> exec () -> waitpid ().В вашей ситуации:

char[] cmd1 = "cat /sys/class/thermal/thermal_zone0/temp > temp.txt";
char[] cmd2 = "cat /sys/class/thermal/thermal_zone2/temp > temp2.txt";
system(cmd1);
system(cmd2);

Основной процесс создаст новый дочерний процесс, запустит утилиту cmd1, дождется завершения cmd1.Затем он порождает другой дочерний процесс, выполняет команду cmd2, ожидает завершения команды cmd2.

В этом контексте уровень потока отсутствует.Поток - это единица выполнения в процессе.Процесс может содержать один или несколько потоков.

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