Linux系统编程手册pdf
背景介绍
Linux系统编程是指利用系统调用和库函数对Linux操作系统进行控制与操作的过程,相较于其他高级语言,系统编程可以更直接地控制系统资源,实现高效的程序设计,本手册旨在为开发者提供详细的Linux系统编程指南,涵盖文件操作、进程管理、线程、网络编程等内容。
主要功能
文件操作
文件读写:open()
,read()
,write()
,close()
文件权限管理:chmod()
,fchmod()
,chown()
文件状态获取:stat()
,fstat()
进程管理
进程创建:fork()
进程终止:exit()
,_exit()
,wait()
,waitpid()
执行新程序:exec()
,execve()
,execlp()
,execvp()
信号处理
信号发送:kill()
,raise()
信号捕获:signal()
,sigaction()
信号集操作:sigemptyset()
,sigaddset()
,sigprocmask()
线程管理
线程创建:pthread_create()
线程同步:互斥锁(pthread_mutex_t
)、条件变量(pthread_cond_t
)
线程属性:pthread_attr_t
网络编程
套接字创建与操作:socket()
,bind()
,listen()
,accept()
,connect()
数据传输:send()
,recv()
地址转换:inet_addr()
,inet_ntoa()
,getaddrinfo()
详细介绍
文件操作
文件读写
文件操作是Linux系统编程的基础之一,常用函数如下:
open()
: 打开文件
int open(const char *pathname, int flags);
read()
: 从文件读取数据
ssize_t read(int fd, void *buf, size_t count);
write()
: 向文件写入数据
ssize_t write(int fd, const void *buf, size_t count);
close()
: 关闭文件
int close(int fd);
文件权限管理
文件权限管理对于系统安全非常重要,常用函数如下:
chmod()
: 改变文件权限
int chmod(const char *path, mode_t mode);
fchmod()
: 改变打开文件的权限
int fchmod(int fd, mode_t mode);
chown()
: 改变文件所有者
int chown(const char *path, uid_t owner, gid_t group);
文件状态获取
获取文件状态信息有助于了解文件的详细情况,常用函数如下:
stat()
: 获取文件状态信息
int stat(const char *path, struct stat *buf);
fstat()
: 获取打开文件的状态信息
int fstat(int fd, struct stat *buf);
进程管理
进程创建与终止
进程管理是系统编程的核心内容之一,常用函数如下:
fork()
: 创建新进程
pid_t fork(void);
exit()
: 终止进程
void exit(int status);
_exit()
: 立即终止进程
void _exit(int status);
wait()
: 等待子进程结束
pid_t wait(int *status);
waitpid()
: 等待指定子进程结束
pid_t waitpid(pid_t pid, int *status, int options);
执行新程序
执行新程序需要使用exec族函数,常用函数如下:
execl()
: 执行程序,参数列表形式
int execl(const char *path, const char *arg, ... /* (char *) NULL */);
execle()
: 执行程序,环境变量列表形式
int execle(const char *path, const char *arg, ..., char *const envp[]);
execv()
: 执行程序,参数数组形式
int execv(const char *path, char *const argv[]);
execvp()
: 执行程序,参数数组形式,自动搜索路径
int execvp(const char *file, path, char *const argv[]);
信号处理
信号发送与捕获
信号处理用于应对异步事件,常用函数如下:
kill()
: 发送信号给进程或进程组
int kill(pid_t pid, int sig);
raise()
: 向自身进程发送信号
int raise(int sig);
signal()
: 设置信号处理函数(不推荐)
void (*signal(int sig, void (*handler)(int)))(int);
sigaction()
: 设置信号处理函数(推荐)
int sigaction(int sig, const struct sigaction *act, struct sigaction *oldact);
信号集操作
信号集操作用于屏蔽或解除特定信号,常用函数如下:
sigemptyset()
: 初始化信号集为空
int sigemptyset(sigset_t *set);
sigaddset()
: 添加信号到信号集
int sigaddset(sigset_t *set, int signum);
sigprocmask()
: 阻塞或解除信号集
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
线程管理
线程创建与同步
线程是轻量级进程,适用于并发任务,常用函数如下:
pthread_create()
: 创建线程
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
pthread_join()
: 等待线程结束
int pthread_join(pthread_t thread, void **retval);
pthread_mutex_init()
: 初始化互斥锁
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
pthread_mutex_lock()
: 加锁互斥锁
int pthread_mutex_lock(pthread_mutex_t *mutex);
pthread_mutex_unlock()
: 解锁互斥锁
int pthread_mutex_unlock(pthread_mutex_t *mutex);
pthread_cond_init()
: 初始化条件变量
int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);
pthread_cond_wait()
: 等待条件变量
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
pthread_cond_broadcast()
: 广播唤醒所有等待线程
int pthread_cond_broadcast(pthread_cond_t *cond);
pthread_cond_signal()
: 唤醒一个等待线程
int pthread_cond_signal(pthread_cond_t *cond);
网络编程
套接字创建与操作
网络编程涉及数据的发送和接收,常用函数如下:
socket()
: 创建套接字
int socket(int domain, int type, int protocol);
bind()
: 绑定套接字到地址
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
listen()
: 监听连接请求
int listen(int sockfd, int backlog);
accept()
: 接受连接请求
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
connect()
: 发起连接请求
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
send()
: 发送数据
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
recv()
: 接收数据
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
sendto()
: 发送数据到指定地址(UDP)
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
recvfrom()
: 接收数据并保存源地址(UDP)
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
inet_addr()
: IP地址转换函数(字符串转数值)
in_addr_t inet_addr(const char *cp);
inet_ntoa()
: IP地址转换函数(数值转字符串)
const char *inet_ntoa(in_addr_t in);
getaddrinfo()
: 获取地址信息(通用接口)
int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res);
getnameinfo()
: 获取名称信息(通用接口)
int getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags);
select()
: 多路复用I/O监控函数(非阻塞操作)
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
poll()
: I/O多路复用监控函数(非阻塞操作)
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
epoll()
: I/O多路复用监控函数(高效非阻塞操作)
int epoll_create(int size); // 创建epoll实例 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); // 注册/修改/删除文件描述符监控事件类型等操作;op值对epoll实例进行相应操作,如EPOLL_CTL_ADD表示注册新的fd到epoll监控队列中,EPOLL_CTL_MOD表示修改已注册的fd的监控事件类型,EPOLL_CTL_DEL表示从epoll监控队列中删除指定的fd,event结构体包含所要控制的文件描述符fd以及与其相关的事件类型events,将某个文件描述符fd以EPOLLIN事件类型注册到epoll实例epfd中,可编写代码如下:struct epoll_event ev;ev.events = EPOLLIN;ev.data.fd = fd;::epoll_ctl(epfd, EPOLL_CTL_ADD, &ev);//返回值为0表示成功,-1表示失败,如果执行成功,则该文件描述符将被添加到epoll的监控队列中,并关联相应的事件类型events,如果执行失败,则可以通过errno获取错误原因,注意:在使用epoll时需要先创建一个epoll实例,然后才能调用epoll_ctl函数来对文件描述符进行控制,在不再需要继续使用时,应该使用close()函数关闭epoll实例以释放相关资源。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1273997.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复