系统编程
文件操作:
1.open&close函数:
包含头文件:
#include <unistd.h> open函数头文件
#include <fcntl.h> 参数头文件
#include <errno.h> 错误信息头文件,strerror(errno)显示错误信息
int fd = open(文件名,参数,权限);
参数包括:O_RDONLY, O_WRONLY, O_RDWR, O_APPEND, O_CREAT, O_EXCL等,参数可以多个,之间用 | 隔开
close(int fd);
2.read&write函数:
int n = read(fd, 缓冲区数据,缓冲区);
return 0为读到文件末尾,n为读到的字节数,-1为错误
int n = write(fd, 缓冲区数据,数据大小);
return n为读到的字节数,-1为错误
3.lseek函数:
off_t lseek(int fd, off_t offset, int whence)
fd:文件描述符 offset:偏移量 whence:偏移起始位置:SEEK_SET/SEEK_CUR/SEEK_END
return 成功:较起始位置便宜量 失败:-1 errno
注意:1.文件读和写共用一个偏移位置
2.lseek能获取大小:lseek(fd, 0, SEEK_END);
3.lseek拓展文件/truncate函数直接拓展
目录操作:
包含头文件#include<dirent.h>
1.opendir函数:
DIR* opendir(char* name);
2.closedir函数:
int closedir(DIR* dp);
3.readdir函数:
struct dirent* readdir(DIR* dp);
重定向函数:
int dup(int oldfd);
返回新文件描述符
int dup2(int oldfd, int newfd);
exec函数族:
1.int execl(file, argv,....,NULL);
进程执行file命令,一般是系统命令如ls,ps等,且argv[0]为file命令本身
2.int execlp(path, argv,....,NULL);
进程执行path路径下的文件
wait函数:
1.pid_t wait(int* status);
阻塞等待子进程退出
status为传出参数,通过status了解状态
2.pid_t waitpid(pid_t pid, int* status, int options);
传入参数pid:>0指定某个子进程进程,-1为任意子进程
返回值:
0:成功回收的pid
=0:参数三指定为WNOHANG,并且子进程没有结束
-1:回收失败
管道:
实现原理:内核通过环形队列实现
int pipe(int pipefd[2]);创建并打开管道
参数:pipefd[0]:读端 、pipe[1]:写端
返回值:成功0,失败-1
读写行为:
1.读管道:
(1)管道有数据:read返回读到的字节数
(2)管道无数据:1)无写端:返回0; 2)有写端:read阻塞等待
2.写管道:
(1)无读端:异常终止
(2)有读端:1)管道满:write阻塞等待; 2)未满:返回写的字节数
有名管道:
包含头文件#include <sys/stat.h>
int mkfifo(const char* pathname, mode_t mode);
参数:pathname:管道名; mode:权限
共享存储映射:
包含头文件#include <sys/mman.h>
创建:
void* mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset);
参数:
addr:指定映射区的首地址,一般为NULL
length:共享存储映射区的大小,<=文件大小
prot:共享内存映射区读写属性,读:PROT_READ、写:PROT_WRITE、读写:PROT_READ|PROT WRITE
flags:标注共享内存的属性,共享:MAP_SHARED、私有:MAP_PRIVATE、匿名:MAP_ANON(此时fd传-1,只能用于血缘关系进程通信)
fd:用于创建共享内存映射区文件的文件描述符
offset:偏移位置,为4k整数倍
返回值:成功:映射区首地址; 失败:MAP_FAILED(void* -1)
释放:
int munmap(void* addr, size_t length);
参数:编号、名称、事件、默认处理动作
addr:mmap返回值,禁止++操作
length:大小
返回值:成功:0;失败:-1
信号:
四要素:
编号、名称、事件、默认动作
1.kill函数:给指定进程发送信号,不一定杀死
int kill(pid_t pid, int signal);
pid:>0 指定进程、=0 同组所有进程、<0 取绝对值发送给进程组、=-1所有进程
2.alarm函数:自然计时
unsigned int alarm(unsigned int second);
返回上次定时剩余时间,无错误现象
3.setitimer函数:
int setitimer(int which, const struct itimerval* new_value, struct itimerval* old_value);
返回值:成功0,失败-1
which:定时方式
new_value:定时秒数
old_value:传出参数
信号集操作函数:
sigset_t set :自定义信号集
sigemptyset(sigset_t* set);清空信号集
sigfillset(sigset_t* set);全置1
sigaddset(sigset_t* set, int signum);添加一个信号到信号集
sigdelset(sigset_t* set, int signum);移出一个信号
sigismember(const sigset_t* set, int signum);判断一个信号是否在信号集中,在返回1,不在返回0
设置信号集屏蔽字和解除屏蔽:
int sigprocmask(int how, const sigset_t* set, sigset_t* oldset);
how:设置阻塞SIG_BLOCK; 取消阻塞SIG_UNBLOCK;自定义set替换maskSIG_SETMASK
set:自定义set
oldset:旧的mask
查看未决信号集:
int sigpending(sigset_t* set);
set:传出的未决信号集