1Linux的系统调用
系统调用System Calls
系统调用:System Calls / Linux API
是一些在应用程序里调用的函数,这些函数间接地调 用了OS中的功能(调用了Linux内核的功能)
在地位上,与Windows API对等
在本质上,只调用了Linux Kernel
在形式上,如果一个函数不在任何库中提供,则它是 系统调用。
如,printf不是系统调用,它是libc库中的函数 mkdir是系统调用
例如,在命令行中,我们可以用命令
# mkdir testdir
来创建一个子目录testdir
那么,如果我们想在程序中来创建一个子目录, 该调用哪个函数呢?
man mkdir (1号manual: 命令行的用法)
man 2 mkdir (2号manual: 函数的用法)
(注:mkdir有多条manual,我们查看2号manual)
.
#include <stdio.h>
// linux
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
int main()
{
mkdir("testdir", 0666); // 这就是system call
return 0;
}
参考文档
当我们需在程序中调用OS的某个功能时,应 该想到用system call函数。
例如,
创建目录
查看文件属性
查看进程列表
获取目录下的所有文件
如何查看可用的系统调用?
man syscalls
根据函数名,再查看该函数的帮助
(官网上提供了一个html格式的文档,是linux1.0版本 系统调用,内容不全)
可以发现,以前学的open, close, read, write属于system call,它们不依赖别的库,直接由操作系统提供。
而pthread和dl不属于系统调用,它们分别在pthread和 dl库中提供。
小结:
1,系统调用的理解
2,系统调用的操作
3,系统调用的参考
2系统调用:读取目录
获取目录下的内容
本节课进一步示范system call的使用
需求:要求获取某个目录下的所有项(文件/ 子目录)的名称。
步骤
- 查找文档,寻找可用的system call
opendir / readdir / closedir - 查看帮助
man opendir - 测试代码
测试函数的用法 - 整合代码(封装)
将测试代码整合到目标项目中
3在代码中调用系统命令
system()
如果有些命令你找不到对应的system call,那么也可以在代码里直 接调用命令行。
system函数用法比较简单:
int ret = system(“rm ‐rf *.txt”);
其返回值就是所调用的命名行的返回值。
注:实际上system函数将创建一个子进程,并一直等待该进程结 束,该函数才返回。
这意味着,如果子进程要运行1分钟才返回,那这个函数就会阻塞 1分钟。如果子进程永不返回,则此函数永远阻塞。。。
popen()
popen():调用某个命令行,并获取其标准输出。p代表 pipe
FILE* fp = popen
(“ifconfig”, “r”);
int n = fread(buf, 1, 512, fp);
pclose
(fp);
注意:
(1)按linux programmer’s manual, 必须用pclose关闭而不 是fclose。
(2)要用"r",不能用"rb"“rt”,因为它本质上不是普通文 件
popen()
popen在linux是一个比较有用的函数,可以用 于获取系统的配置。
有些配置用命令行比较方便,但却找不到相 应的系统函数,所以只好用popen来读取其输 出。
优先找system call,找不到的时候再用popen
注:
system是标准C函数
popen/pclose不是标准C函数,是linux下的特 有的函数。 (windows下相应的叫_popen/_pclose)
小结:
1,system()
2,system()
学习资源 [《C语言/C++学习指南》Linux开发篇
]( https://edu.csdn.net/course
/detail/1353)