🤖 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)