用户空间实现系统调用的两种方式

一种是间接的系统调用:syscall(SYS_xxx); 其中 SYS_xxx 是系统调用号;
另一种是通过API函数,API函数一般会自动调用内核空间中同名的系统调用函数。

举例如下:

#include <syscall.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>

int main(void)
{
 long ID1,ID2;
 ID1=syscall(SYS_getpid);
 printf("syscall(SYS getpid)=%ld\n",ID1);
 ID2=getpid();
 printf("getpid()=%ld\n",ID2);
 return(0);
}

编译:[root@google linux]# gcc -o syscall.o syscall.c

运行:[root@google linux]# ./syscall.o
syscall(SYS getpid)=4710
getpid()=4710

 

系统调用执行过程示意图如下:
用户空间实现系统调用的两种方式 - iDNS - 互联网是人类进步的阶梯

API库函数完全运行在用户空间,很多是由编译器提供的,但库函数归根结底还是要由内核态的系统调用来具体执行和实现。比如:标准C库函数printf()可以被看做是一个通用的输出语句,但它实际做的是将数据转化为符合格式的字符串并且调用系统调用 write()输出这些字符串。这一点可以用strace命令跟踪到。

strace描述如下:
NAME
       strace - trace system calls and signals

SYNOPSIS
       strace  [  -dffhiqrtttTvxx  ]  [  -acolumn ] [ -eexpr ] ...  [ -ofile ] [ -ppid ] ...  [ -sstrsize ] [
       -uusername ] [ -Evar=val ] ...  [ -Evar ] ...  [ command [ arg ...  ] ]

       strace -c [ -eexpr ] ...  [ -Ooverhead ] [ -Ssortby ] [ command [ arg ...  ] ]

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值