如果我执行以下单线程代码:
#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()函数时,该操作将控制权传递给了外壳程序,然后该外壳程序被抢占并执行命令,然后将该操作交还给程序线程?
有人可以告诉我上述代码在线程级别如何工作吗?
答案 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()
产生一个新进程,当工作完成时,该进程将被终止。
您可以说总共以顺序方式创建了三个流程。但是,由于进程之间没有共享任何内容-它们不是线程。