操作系统学习--系统调用
系统调用
有关进程管理的系统调用 (UNIX)
Pid = fork() 创建一个与父进程相同的子进程;Pid = waipid(pid,&statioc,options) 等待子进程结束;S = execve(name,argv,environp) 更换进程映像;exit(status) 进程结束,返回状态
fork的示例
main(){
int i, pid;
for(i = 1;i <= 3;i++){
if((pid = fork()) == 0){
printf("In child %d. \n",i);
}
}
}
在这个示例中,虽然看起来循环了3次,但是对于fork进程而言,第一次循环共有2个进程,第二次共有4个进程,第三次共有了8个进程,如下图:

进程在内存中的地址空间

进程有三种类型的段:正文,数据,堆栈
有关文件管理的系统调用
Fd = open(file,how,...) 打开一个文件
S -= close(fd) 关闭一个文件
n = read(fd,buffer,nbytes) 从文件中读取数据
n = write(fd,buffer,nbytes) 写数据到文件中
Position = lseek(fd,offset,whence) 改变文件的读写指针
S = stat(name,&buf) 取文件的状态
有关目录管理的系统调用
S = mkdir(name,mode) 创建一个新目录
S = rmdir(name) 删除一个空目录
S = link(name1,name2) 创建一个目录项name2,指向name1
S = unlink(name) 删除一个目录项
S = mount(special,name,flag) 安装一个文件系统
S = umount(special) 拆卸一个文件系统
目录管理的示例
Link
假设有以下目录:
"/usr/jim/memo"和"/usr/ast"
其中/memo在/jim中的ID是70,现有以下代码:
link("/usr/jim/memo","/usr/ast/note");
其作用就是在"/usr/ast"中创建一个目录/note,其ID与/memo的ID相同,为70. 这就是连接/usr/jim/memo到/ast的目录前。
mount
对于下列代码:
mount("dev/fd0","/mnt",0)
其作用就是在/mnt下安装dev/fd0这个目录。
(事实上,fd0 很可能是个设备,比如磁盘,软盘等)
其他系统调用
S = chdir(dirname)改变当前目录;
S = chmod(name,mode) 改变文件权限;
S = kill(pid,signal) 给一个进程发送信号;
Seconds = time(&seconds) 取1970年1月1日以来的秒数。
UNIX与Windows系统调用对比
| UNIX | WIN | 描述 |
|---|---|---|
fork |
CreateProcess |
创建一个新进程 |
waitpid |
WaitForSingleObject |
等待一个进程结束 |
exit |
ExitProcess |
结束执行 |
open |
CreeateFile |
创建/打开文件 |
close |
CloseHandle |
关闭文件 |
read |
ReadFile |
从文件中读取数据 |
write |
WriteFile |
往文件中写数据 |
| ...... | ...... | ...... |
基本所有的UNIX系统调用在Windows系统都有对应版本。

浙公网安备 33010602011771号