进程相关
获取进程id与创建进程
- 头文件: <unistd.h>
- getpid() : 获取进程id
- getppid() : 获取父进程的id
- fork() : 创建子进程, 给父进程返回子进程的id, 给子进程返回0
等待子进程
- 头文件: <sys/types.h> <sys/wait.h>
- pid_t wait(int*status);
- 返回值: 成功返回被等待的进程id, 失败返回-1
- pid_ t waitpid(pid_t pid, int *status, int options);
- 返回值: 成功返回收集到的子进程id失败返回-1.
- 参数:
- Pid : -1表示等待任一个子进程
- status : 获取状态码
- options : 默认为0(阻塞等待). 为WNOHANG,当没有可等待的进程返回0
替换函数
- int execl(const char *path, const char *arg, ...);
- int execlp(const char *file, const char *arg, ...);
- int execle(const char *path, const char *arg, ...,char *const envp[]);
- int execv(const char *path, char *const argv[]);
- int execvp(const char *file, char *const argv[]);
- int execve(const char *path, char *const argv[], char *const envp[]);
名称解释:
- l(list) : 表示参数采用列表
- v(vector) : 参数用数组
- p(path) : 有p自动搜索环境变量PATH
- e(env) : 表示自己维护环境变量
返回值:出错返回-1, 成功没有返回值(已经替换)
文件相关
文件开关读写
- 头文件: <sys/types.h>, <sys/stat.h> , <fcntl.h>
- int open(const char *pathname, int flags);
- int open(const char *pathname, int flags, mode_t mode);
- ssize_t write(int fd, const void *buf, size_t count);
- ssize_t read(int fd, void *buf, size_t count);
- int close(int fd);
- 参数flags: O_APPEND O_CREATE O_TRUNC等 flags:选项标记位
重定向
- int dup2(int oldfd, int newfd); 将newfd文件描述符复制为oldfd
- 失败返回 -1
通信相关
匿名管道
- 头文件:<unistd.h>
- int pipe(int fd[2]);
- 返回值:成功返回0,失败返回错误代码
命名管道
- 头文件: <sys/types.h> <sys/stat.h>
- int mkfifo(const char* pathname , mode_t mdoe)
- 返回值: 创建成功: 0 创建失败: -1
共享内存
- 头文件: <sys/ipc.h> <sys/shm.h>
- key_t ftok(const char *pathname, int proj_id); 用于创建IPC对象的键值
- int shmget(key_t key, size_t size, int shmflg); 用来创建共享内存
- void *shmat(int shmid, const void *shmaddr, int shmflg); 将共享内存段连接到进程地址空间
- int shmdt(const void *shmaddr); 将共享内存段与当前进程脱离
- int shmctl(int shmid, int cmd, struct shmid_ds *buf); 用于控制共享内存
信号相关
信号的产生
- 系统调用
- int kill(pid_t pid, int signo); 向指定进程发送指定信号 头文件: <signal.h>
- int raise(int signo); 给当前进程发送指定的信号 头文件: <signal.h>
- void abort(void); 使当前进程接收到信号而异常终止 头文件: <stdlib.h>
- 软件条件
- unsigned int alarm(unsigned int seconds);
- 告诉内核在seconds秒之后给当前进程发SIGALRM信号, 该信号的默认处理动作是终止当前进程
信号的处理
- sighandler_t signal(int signum, sighandler_t handler); //回调函数
- typedef void (*sighandler_t)(int); //函数指针
- int sigaction(int signo,const struct sigaction *act,struct sigaction *oact);
- 可以读取和修改与指定信号相关联的处理动作
信号集操作函数
- int sigemptyset(sigset_t *set); 初始化set所指向的信号集,使其中所有信号的对应bit清零
- int sigfillset(sigset_t *set);初始化set所指向的信号集,使其中所有信号的对应bit置位,
- int sigaddset (sigset_t *set, int signo);
- int sigdelset(sigset_t *set, int signo);
- int sigprocmask(int how, const sigset_t *set, sigset_t *oset);读取或更改进程的阻塞信号集
- int sigpending(sigset_t *set); 读取当前进程的未决信号集,通过set参数传出
多线程相关
头文件: <pthread.h>
控制线程
- int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 创建线程
- int pthread_join(pthread_t thread, void **retval); 等待线程
- void pthread_exit(void *value_ptr); 终止线程
- int pthread_cancel(pthread_t thread); 取消一个执行中的线程
- int pthread_detach(pthread_t thread); 线程分离
互斥锁
- int pthread_mutex_init(pthread_mutex_t *mutex)函数进行初始化
- int pthread_mutex_lock(pthread_mutex_t *mutex)进行加锁(阻塞式)
- int pthread_mutex_trylock(pthread_mutex_t *mutex)(非阻塞式)
- int pthread_mutex_unlock(pthread_mutex_t *mutex)进行解锁
- int pthread_mutex_destroy(pthread_mutex_t *mutex)进行销毁
条件变量
- int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);
- int pthread_cond_destroy(pthread_cond_t *cond);
- int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);
- int pthread_cond_signal(pthread_cond_t *cond);唤醒等待在条件变量上的一个线程
- int pthread_cond_broadcast(pthread_cond_t *cond);唤醒所有等待在条件变量上的线程
信号量
头文件: <semaphore.h> <pthread.h>
- int sem_init(sem_t *sem, int pshared, unsigned int value);
- int sem_destroy(sem_t *sem);
- int sem_wait(sem_t *sem);
- int sem_post(sem_t *sem);释放信号量,将信号量的值加1,唤醒等待该信号量的线程
套接字相关
头文件:<sys/types.h> <sys/socket.h> <arpa/inet.h> <netinet/in.h>
创建连接
- int socket(int domain, int type, int protocol);创建 socket 文件描述符
- int bind(int socket, const struct sockaddr *address,socklen_t address_len);绑定端口号
- int listen(int socket, int backlog); 开始监听socket(TCP, 服务器)
- int accept(int socket, struct sockaddr* address,socklen_t* address_len);接收请求 (TCP,服务)
- int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);建立连接 (TCP,客户)
- int close(int sockfd): 关闭与客户端的连接
通信
- ssize_t send(int sockfd, const void* buf, size_t len, int flags); 通过套接字发送数据TCP服/客
- ssize_t recv(int sockfd, const void* buf, size_t len, int flags); 通过套接字读数据TCP服/客
- ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); UDP,服务/客户,发数据
- ssize_t recvfrom(int sockfd, void* buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); UDP, 服务/客户,读数据
- FILE* popen(const char* command, const char *type); UDP, 服务, 处理数据
多路复用相关
select
- 头文件: sys/select.h
- int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval timeout) 监视文件描述符集合中的文件描述符
- void FD_ZERO(fd_set *set) 将文件描述符集合 set 清空
- void FD_SET(int fd, fd_set *set) 将文件描述符 fd 添加到文件描述符集合 set 中
- void FD_CLR(int fd, fd_set *set) 将文件描述符 fd 从文件描述符集合 set 中移除
- int FD_ISSET(int fd, fd_set *set) 检测文件描述符 fd 是否在文件描述符集合 set 中
poll
- 头文件:poll.h
- int poll(struct pollfd *fds, nfds_t nfds, int timeout) 监视一组文件描述符的状态变化
-
struct pollfd { int fd; // 文件描述符 short events; // 期望的事件short revents; // 实际发生的事件 }
-
epoll
- 头文件:sys/epoll.h
- int epoll_create(int size) 用于创建一个 epoll 实例,返回一个文件描述符
- int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)控制 epoll 实例上的文件描述符
-
op:EPOLL_CTL_ADD(将 fd 添加到 epoll 实例中)EPOLL_CTL_MOD(修改已添加的 fd 在 epoll 实例上的事件)EPOLL_CTL_DEL(从 epoll 实例中删除 fd)fd 是待操作的文件描述符 event是epoll_event 结构体指针,用于指定待添加或修改的事件
-
- int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout)等待事件发生
-
struct epoll_event { __uint32_t events; // 事件类型 epoll_data_t data; // 用户数据 };
-