操作系统:系统调用

时间

#include <time.h>
time_t time(time_t *t) ;
  • 功能:返回总秒数。(从1970年1月1日)
  • 参数t:存放总秒数的缓存的地址。
    time_t其实就是int32_t类型,只不过被typedef重命名了。
    调用time时,我们需要定一个int变量(缓存)来存放总秒数。
  • 返回值:函数调用成功返回总秒数,失败则返回(time_t)-1 , errno被设置。

获取总秒数的方式有两种。

  • 通过返回值获取

    time_t tim = time(NULL);
    

    不使用参数时,参数指定为NULL.

  • 参数

    time_t tim;
    time(&tim);
    
#include <time.h>             
int clock_gettime(clockid_t clk_id, struct timespec *tp);  
  • 参数

    • clk_id:时钟种类
      • CLOCK_REALTIME :测量实时时间的系统时钟
      • CLOCK_REALTIME_COARSE:更快但是精度不是很高的时钟类型
      • CLOCK_THREAD_CPUTIME_ID: Thread-specific CPU-time clock.
      • CLOCK_PROCESS_CPUTIME_ID: Per-process CPU-time clock (measures CPU time consumed by all threads in the process).
    • tp:存储时间的结构体指针
    struct timespec {                   
        time_t   tv_sec;/* seconds */   
        long     tv_nsec;/* nanoseconds */   
    }; 
    

进程管理

调用说明
pid=fork()创建与父进程相同的子进程
pid=waitpid(pid,&statloc,options)等待一个子进程终止
s=execve(name,.argv,.environp)替换一个进程的核心映像
exit(status)终止进程执行并返回状态

文件管理

调用说明
fd=open(file,flags,…)打开一个文件使用读、写。
s=close(fd)关闭一个打开的文件
n=read(fd,buffer,nbytes)把数据从一个文件读到缓冲区中
n=write(fd,buffer,nbytes)把数据从缓冲区写到一个文件中
position =lseek(fd,offset,whence)移动文件指针
s=stat(name,&buf)取得文件状态信息

open

#include <fcntl.h>
int open(const char *pathname,int flags[,mode_t mode]);//open and possibly create a file

如果没有mode参数,只能打开存在的文件,否则会报错;如果有mode参数,就会按照mode指定的文件权限创建文件。

返回:打开成功返回文件操作符,否则返回-1并设置errno

参数:

  • flags

    以下三个选项必选其中之一,且是互斥的

    • O_RDONLY :Open for reading only.

    • O_WRONLY:Open for writing only.

    • O_RDWR:Open for reading and writing. The result is undefined if this flag is applied to a FIFO.

    以下是可选组合选项,通过|逻辑或组合

    • O_CREAT:若欲打开的文件不存在则自动建立该文件.

    • O_EXCL:如果O_EXCL与O_CREAT 被同时设置, 此指令会去检查文件是否存在,文件若不存在则建立该文件, 否则将导致打开文件错误. 此外, 若O_CREAT 与O_EXCL 同时设置, 并且欲打开的文件为符号连接, 则会打开文件失败.

    • O_NOCTTY:如果欲打开的文件为终端机设备时, 则不会将该终端设备当成进程控制终端机.

    • O_TRUNC:若文件存在并且以可写的方式打开时, 此旗标会令文件长度清为0, 而原来存于该文件的资料也会消失.

    • O_APPEND 当读写文件时会从文件尾开始移动, 也就是所写入的数据会以附加的方式加入到文件后面.

    • O_NONBLOCK:以非阻塞的方式打开文件, 也就是无论有无数据读取或等待, 都会立即返回进程之中.
      如果没有设置O_NONBLOCK:

      • 以只读模式open会阻塞直到有进程open该文件for write
      • 以只写模式open会阻塞知道有进程open该文件for read
      • 只有当设备可用时才会返回

      如果设置了O_NONBLOCK:

      • 当以只读或只写模式打开一个FIFO时,只读模式的open函数会立即返回,只写模式的open函数会返回错误如果当前无进程has the file open for reading
    • O_NDELAY 同O_NONBLOCK.

    • O_SYNC 以同步的方式打开文件.

    • O_NOFOLLOW:如果参数pathname 所指的文件为一符号连接, 则会令打开文件失败.

    • O_DIRECTORY:如果参数pathname 所指的文件并非为一目录, 则会令打开文件失败。

  • 可选参数mode,只有在创建新文件时才会生效

    • S_IRWXU,00700 权限, 代表该文件所有者具有可读、可写及可执行的权限.
    • S_IRUSR 或S_IREAD, 00400 权限, 代表该文件所有者具有可读取的权限.
    • S_IWUSR 或S_IWRITE, 00200 权限, 代表该文件所有者具有可写入的权限.
    • S_IXUSR 或S_IEXEC, 00100 权限, 代表该文件所有者具有可执行的权限.
    • S_IRWXG,00070 权限, 代表该文件用户组具有可读、可写及可执行的权限.
    • S_IRGRP,00040 权限, 代表该文件用户组具有可读的权限.
    • S_IWGRP,00020 权限, 代表该文件用户组具有可写入的权限.
    • S_IXGRP,00010 权限, 代表该文件用户组具有可执行的权限.
    • S_IRWXO,00007 权限, 代表其他用户具有可读、可写及可执行的权限.
    • S_IROTH,00004 权限, 代表其他用户具有可读的权限
    • S_IWOTH,00002 权限, 代表其他用户具有可写入的权限.
    • S_IXOTH,00001 权限, 代表其他用户具有可执行的权限.

write&read

#include <unistd.h>
ssize_t write(int fd,const void *buf,size_t count);//write to a file descriptor
ssize_t read(int fd,const void *buf,size_t count);//read from a file descriptor
//fd:文件描述符
//buf:写缓存区地址或读缓存区地址
//count:缓存区的长度

lseek

#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);

设置文件指针偏置

参数:

  • whence
    • SEEK_SET :将文件偏置设置为offset 字节
    • SEEK_CUR:文件偏置当前位置加上offset字节
    • SEEK_END:文件偏置设置为文件的末尾加上offset字节

目录和文件系统管理

调用说明
s=mkdir(name,mode)创建一个新目录
s=rmdir(name)删去一个空目录
s=link(name1,name2)创建一个新目录项name2,并指向 name1
s=unlink(name)删去一个目录项
s=mount(special,name,flag)安装一个文件系统
s=umount(special)卸载一个文件系统

错误处理

函数调用出错时,Linux系统使用错误编号(整形数)来标记具体出错的原因,每个函数有很多错误号,每个错误号代表了一种错误,产生这个错误时,会自动的将错误号赋值给errno这个全局变量。
errno是Linux系统定义的全局变量,可以直接使用。
错误号和errno全局变量都被定义在了errno.h头文件,使用errno时需要包含这个头文件。

<stdio.h>库函数 perror
调用perror函数时,它会自动去一张对照表,将errno中保存的错误号,换成具体的文字信息并拉印出来,我们就能知道函数的具体错误原因了。

其他

调用说明
s=chdir(dirname)改变工作目录
s=chmod(name,mode)修改一个文件的保护位
s=kill(pid,signal)发送信号给进程
seconds=time(&seconds)获取从1970年1月1日至今的时间

上面的系统调用参数中有一些公共部分,例如pid 系统进程id,fd是文件描述符,n是字节数,position是在文件中的偏移量、seconds是流逝时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shilong Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值