单线程程序是否在多个线程上执行? [C]

时间:2019-02-14 00:50:15

标签: c multithreading shell single-threaded

如果我执行以下单线程代码:

#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()函数,该函数需要执行shell命令。那么,当该程序调用两个shell命令函数时,它们是在两个不同的线程(该程序的一个线程和另一个由shell执行的线程)上执行的吗?还是调用system()函数时,该操作将控制权传递给了外壳程序,然后该外壳程序被抢占并执行命令,然后将该操作交还给程序线程?

有人可以告诉我上述代码在线程级别如何工作吗?

2 个答案:

答案 0 :(得分:3)

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终止。然后它将生成另一个子进程,执行utily cmd2,等待cmd2终止。

在这种情况下没有线程级别。线程是进程中执行的单元。一个进程可以包含一个或多个线程。

答案 1 :(得分:1)

在Linux上,线程和进程是相似的-它们称为任务。在Linux中,线程只是一个与其他进程共享少量内容的进程。 system()函数调用是一个阻塞的调用,当system()完成工作时,程序将等待。 system()产生一个新进程,当工作完成时,该进程将被终止。

您可以说总共以顺序方式创建了三个流程。但是,由于进程之间没有共享任何内容-它们不是线程。