文章目录
article
基础接口
AI文章摘要
qwen-turbo-latest
加载中...
1. unistd.h
1.1 数据结构
1.2 函数
//文件操作
ssize_t read( //成功返回读到字节数(读到末尾返回0), 失败返回-1设置errno
int fd,
void* buff,
size_t count)
ssize_t write( //成功返回写入的字节数(未写入返回0), 失败返回-1设置errno
int fd,
void* buff,
size_t count)
off_t lseek( //设置文件指针为whence+offset, 成功返回文件指针位置, 失败返回-1设置errno, 使用lseek扩展文件时需要进行一次写操作.
int fd,
off_t offset,
int whence) // SEEK_SET(文件开始) SEEK_CUR(文件当前位置) SEEK_END(文件结尾)
int close(int fd) //关闭文件描述符, 成功返回0, 失败返回-1并设置errno
int dup(int fd) //创建一个文件描述符, 指向fd
int dup2(int oldfd,int newfd) //newfd指向oldfd
int truncate( //截断
const char *path,
off_t length)
ssize_t readlink( // 读取软连接
const char *pathname,
char *buf,
size_t bufsiz)
int unlink(const char *pathname)//删除软硬连接, 当有进程在使用时会暂时不删, 待进程释放后删除
//进程
pid_t fork(void) //创建子进程, 成功父进程返回子进程id, 子进程返回0, 失败返回-1设置错误码.
pid_t getppid() //获取父进程id
pid_t getpid() //获取进程id
void exit(int status) //退出进程, 函数不会返回
int chdir( //改变工作目录, 工作路径进程唯一, 程序调用不会改变shell的工作路径, 更改工作目录需要目录的执行权限
const char *path) //工作目录字符串
char *getcwd( //获取当前工作路径.成功字符串指针, 失败返回NULL
char *buf, //传出参数, 存储传出的工作路径
size_t size) //buf的大小
pid_t wait( //阻塞等待一个子进程终止, 返回处理的子进程. -1代表回收失败(无子进程或发生错误)
int* status) //是一个记录子进程状态的传出参数,使用xxx函数查看
pid_t waitpid( //比wait强大, 能指定任意子进程或设置非阻塞等待
pid_t pid, //小于-1代表等待特定组id的子进程, 等于1代表任意子进程(和wait一致), 等于0代表回收进程组id和调用进程组id相同的子进程, 大于0代表特定子进程
int* status, //是一个记录子进程状态的传出参数,使用xxx函数查看
int option) //0代表阻塞, 3(WNOHAND)代表非阻塞
//进程组
pid_t getpgrp (void) //获取进程组id
int setpgid( //设置进程组id
pid_t pid, //
pid_t pgid); //
//会话
pid_t getsid(pid_t pid) //获取进程会话id
pid_t setsid(void) //设置会话id, 常用于创建新的会话.
//exec函数,替换进程的data和text段, 然后从text的第一条指令开始执行
int excel( //使用绝对路径定位程序
const char *path,
const char* argv,
...)
int excelp( //使用PATH环境变量定位程序
const char *path, //
const char* argv, //
...) //
int excele( //
const char *path, //
const char* argv, //
..., //
const char* env[]); //
excev、excevp、exceve和前三个函数类似, 使用指针数组传递参数(最终前三个函数都要调用这三个函数)
//管道操作
/*
1)当写端全部关闭, 读端read函数读到末尾返回0; 当部分关闭, 读端read函数阻塞, 非阻塞read设置错误代码
2)当读端全部关闭, 写端调用write函数时, 进程会收到SIGPIPE信号而异常终止; 当读端部分关闭, 写端可以正常调用write函数, 若缓冲区满了则阻塞
特点: 简单, 只能由有血缘关系的进程(父子关系\共同祖先)使用
*/
int pipe(int fildes[2])//获取管道的读写文件描述符, 分别存储于fildes[0]和fildes[1]. fork场景下父子进程拥有相同的文件描述符, 为了稳定性考虑一般父子进程各关闭一个方向上的文件描述符
2. sys/mmap.h
2.1 数据结构
2.2 函数
void* mmap( //将文件特定区域映射到内存中, 返回映射区首地址.
void* addr, //一般传NULL让内核自动分配
size_t length, //映射区长度
int prot, //PORT_READ或PORT_WRITE映射区读写权限
int flags, //设置映射区是否影响文件(MAP_SHAREG共享|MAP_PRIVATE私有)
int fd, //文件描述符
off_t offset) //指定文件的偏移值(mmap使用offset+length的区块初始化映射区)
int munmap( //释放内存映射区
void *addr, //mmap返回的映射区地址
size_t length); //映射区长度
3. sys/shm.h
共享内存可以通过ipcs查看,Linux对共享内存管理是通过 shmid+进程引用计数 实现的. 当一个共享内存被打开时, 它处于public状态, 任何进程都可以绑定到该共享内存上, 当有其中一个进程对共享内存执行了shmctl设置了IPC_RMDI, 该共享内存的shmid会发生变化, 并处于private状态, 此时不接受其他进程加入.
3.1 数据结构
struct shmid_ds {
struct ipc_perm shm_perm; /* Ownership and permissions */
size_t shm_segsz; /* Size of segment (bytes) */
time_t shm_atime; /* Last attach time */
time_t shm_dtime; /* Last detach time */
time_t shm_ctime; /* Last change time */
pid_t shm_cpid; /* PID of creator */
pid_t shm_lpid; /* PID of last shmat(2)/shmdt(2) */
shmatt_t shm_nattch; /* No. of current attaches */
...
};
3.2 函数
//创建共享内存
int shmget( //成功返回共享内存描述符(shmid), 失败返回-1设置errno
key_t key, //
size_t size, //共享内存大小
int shmflg) //共享内存读写权限, 8进制, IPC_CREAT 获取一块共享内存, IPC_EXCL 配合IPC_CREAT使用, 判断共享内存是否存在, 若已存在则会报错
//建立共享内存联系
void *shmat( //获取共享内存地址, 失败返回(void*)-1设置error
int shmid, //共享内存描述符, 由shmget获取.
const void *shmaddr, //可以自己使用自己申请的堆空间, 使用NULL则由系统指定
int shmflg) //SHM_RND读写, SHM_RDONLY只读
int shmdt( //取消进程与共享内存的联系.ipcs命令可以查看共享内存空间正在使用的进程数
const void *shmaddr). //
//控制共享内存
int shmctl( //控制共享内存, 成功返回0,失败返回-1设置error
int shmid, //共享内存描述符
int cmd, //IPC_STAT .... IPC_RMID 标记该共享内存即将被销毁(当与该共享内存关联的进程数为0时进行销毁)
struct shmid_ds *buf) //
4. signal.h
4.1 数据结构
struct itimerval {
struct timeval it_interval; /* Interval for periodic timer */
struct timeval it_value; /* Time until next expiration */
};
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
typedef void (*sighandler_t)(int);
struct sigaction {
void(*sa_handler)(int); //捕捉到信号时调用的函数
void(*sa_sigaction)(int, siginfo_t *, void *); //捕捉到信号时调用的函数, sa_falgs指定
sigset_t sa_mask; //处理函数调用期间使用的临时阻塞信号集,处理完毕后恢复PCB默认的.被捕信号自动设置
int sa_flags; //0,调用sa_handler. 其他, 调用sa_sigaction
void(*sa_restorer)(void); //无效参数,不填
};
4.2 函数
//信号发送
int kill( //向进程号为pid的进程发送信号
pid_t pid, //小于-1: pid绝对值表示的组id中的进程。等于-1: 当前进程有权限发送的所有进程, 例如不能发给其他用户。等于0: 当前进程调用进程组内的所有进程。大于0 : 要发送的进程id。
int sig) //
int raise(int sig) //向自己发送信号
int abort() //向自己发送SIGKILL信号
unsigned alarm(unsigned seconds)//定时向自己发送定时信号, 返回上次设定定时器时的时间还有多少秒触发, 0代表初次设定闹钟
int getitimer(
int which, //ITIMER_REAL|ITIMER_VIRTUAL|ITIMER_PROF, 设置记录时间方式
struct itimerval *curr_value) //定时器当前值, 是一个传出参数, 使用curr_value.it_value查看剩余触发时间
int setitimer(
int which, //
const struct itimerval *new_value,
struct itimerval *old_value)
//信号集处理
int sigemptyset(sigset_t *set) //清空信号集
int sigfillset(sigset_t *set) //填充信号集
int sigaddset(sigset_t *set, int signum) //往信号集添加信号
int sigdelset(sigset_t *set, int signum) //往信号集删除信号
int sigismember(const sigset_t *set, int signum)//判断信号是否在该集合中, 是返回1否返回0
int sigpending(sigset_t *set) //获取未决信号集
int sigprocmask( //设置阻塞信号集
int how, //SIG_BLOCK(mask=mask|set)、SIG_UNBLOCK(mask=mask&~set)、SIG_BLOCK(mask=set)
const sigset_t *restrict set,
sigset_t *restrict oset) //返回修改前的阻塞信号集
//信号捕捉
sighandler_t signal(
int signum, //信号编号
sighandler_t handler) //typedef void (*sighandler_t)(int)信号触发回调函数
int sigaction(
int signum,
const struct sigaction *restrict act,
struct sigaction *restrict oldact)