fragment/常用函数/sys_functions.c
2021-08-29 00:02:47 +08:00

206 lines
14 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//#######################################################################
FILE *fopen(const char *path, const char *mode); //打开文件失败返回NULL
//参数说明:
//参数path字符串包含欲打开的文件路径及文件名参数mode字符串则代表着流形态。
//mode有下列几种形态字符串:
//r 以只读方式打开文件,该文件必须存在。
//r+ 以可读写方式打开文件,该文件必须存在。
//rb+ 读写打开一个二进制文件,允许读写数据,文件必须存在。
//rw+ 读写打开一个文本文件,允许读和写。
//w 打开只写文件若文件存在则文件长度清为0即该文件内容会消失。若文件不存在则建立该文件。
//w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
//a 以附加的方式打开只写文件。若文件不存在则会建立该文件如果文件存在写入的数据会被加到文件尾即文件原先的内容会被保留。EOF符保留
//a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 原来的EOF符不保留
//wb 只写打开或新建一个二进制文件;只允许写数据。
//wb+ 读写打开或建立一个二进制文件,允许读和写。
//ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。
//at+ 打开一个叫string的文件a表示append,就是说写入处理的时候是接着原来文件已有内容写入不是从头写入覆盖掉t表示打开文件的类型是文本文件+号表示对文件既可以读也可以写。
//上述的形态字符串都可以再加一个b字符如rb、w+b或ab+等组合加入b 字符用来告诉函数库以二进制模式打开文件。如果不加b表示默认加了t即rt,wt,其中t表示以文本模式打开文件。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限此文件权限也会参考umask值。
//有些C编译系统可能不完全提供所有这些功能有的C版本不用"r+","w+","a+",而用"rw","wr","ar"等,读者注意所用系统的规定。
int fclose(FILE *stream); //关闭一个文件流成功返回0, 失败返回EOF
int feof(FILE *stream); //文件结束返回非0
int fseek(FILE *stream, long offset, int fromwhere); //文件位置指针偏移成功返回0
//0文件头1当前2文件尾
long ftell(FILE *stream); //返回文件位置指针当前位置
int fgetc(FILE *stream); //结尾或出错返回EOF
int fputc(int n, FILE *fp); //失败返回EOF
char *fgets(char *buf, int bufsize, FILE *stream); //出错返回NULL
int fputs(const char *str, FILE *fp); //向文件写入字符串失败返回EOF
size_t fread(void *buffer, size_t size, size_t count, FILE *stream); //读取文件中count*size个字节成功返回读取到的元素个数(count)否则返回0
size_t fwrite(const void *buffer, size_t size, size_t count, FILE *stream); //返回实际写入的数据块数目
int fscanf(FILE *stream, const char *format, [argument...]);
int fprintf(FILE *stream, const char *format, [argument...]);
//#######################################################################
#define STDIN_FILENO 0 //标准输入
#define STDOUT_FILENO 1 //标准输出
#define STDERR_FILENO 2 //标准错误
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> //open、close头文件
int open(const char *pathname,int flags); //文件存在
int open(const char *pathname,int flags,mode_t mode); //文件不存在
//成功返回fd失败返回-1
int close (int fd); //关闭文件成功返回0,失败返回-1
#include <unistd.h> //write,read,remove头文件
ssize_t write(int fd,const void *addr,size_t count); //写文件,成功返回写入字节个数,失败返回-1
ssize_t read(int fd,void *addr,size_t count); //读文件,成功返回读出字节个数,失败返回-1
int remove(const char *pathname); //删除文件,成功返回0,失败返回-1
#include <sys/types.h>
#include <unistd.h> //进程函数头文件
pid_t getpid(); //获取本进程号
pid_t getppid(); //获取父进程号
pid_t getpgid(); //获取进程组号
pid_t fork(); //在已有进程中创建子进程
//成功子进程返回0,父进程返回子进程ID失败返回-1
unsigned int sleep(unsigned int sec); //进程挂起指定秒数
//成功返回0,中断返回剩余秒数
#include <sys/wait.h> //wait、waitpid头文件
pid_t wait(int *status); //等待子进程结束回收其资源
//成功返回子进程号,失败返回-1
WIFEXITED(status); //子进程正常终止取出字段值非零
WEXITSTATUS(status) //返回保存在status变量8~16位的子进程退出状态正常退出才可使用
pid_t waitpid(pid_t pid,int *status,int options); //等待子进程结束回收其资源
//成功返回子进程号,失败返回-1
#include <stdlib.h> //exit头文件
void exit(int value); //结束进程执行
#include <unistd.h> //_exit头文件value低八位有效
void _exit(int value); //结束进程执行value低八位有效
#include <stdlib.h> //atexit头文件
int atexit(void (*function)(void)); //注册进程结束前调用的函数
pid_t vfork(); //创建子进程,出错返回-1
#include <unistd.h> //exec函数组头文件
int execl(const char *pathname,const char *arg0,...,NULL);
int execlp(const char *filename,const char *arg0,...,NULL);
int execle(const char *pathname,const char *arg0,...,NULL,char *const envp[]);
int execv(const char *pathname,char *const argv[]);
int execvp(const char *filename,char *const argv[]);
int execve(const char *pathname,char *const argv[],char *const envp[]);
//exec函数组成功无返回失败返回-1
#include <stdlib.h> //system头文件
int system(const char *command); //调用系统命令command空时返回非0,失败返回127或-1
//Ctrl+c产生中断信号:SIGINT
//Ctrl+\产生中断信号:SIGQUIT
//Ctrl+z产生中断信号:SIGSTOP
//SIGKILL和SIGSTOP的处理方式不可更改
#include <sys/types.h>
#include <signal.h> //kill头文件
int kill(pid_t pid,int signum); //给进程发送信号成功返回0,失败返回-1
#include <unistd.h> //alarm头文件
unsigned int alarm(unsigned int seconds); //seconds秒后发出SIGALRM信号默认终止
#include <signal.h> //raise头文件
int raise(int signum); //给进程发送信号成功返回0,失败返回-1
#include <stdlib.h> //abort头文件
void abort(); //默认向进程发送SIGABRT信号默认退出
//终止前刷新缓冲区,关闭文件描述符
#include <unistd.h> //pause头文件
int pause(); //挂起进程直至捕捉到信号,成功返回-1
#include <signal.h> //signal头文件
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum,sighandler_t handler); //注册信号处理函数
SIG_IGN //忽略信号
SIG_DFL //执行默认动作
#include <signal.h> //信号集头文件
int sigemptyset(sigset_t *set); //初始化一个空信号集成功返回0,失败返回-1
int sigfillset(sigset_t *set); //初始化为所有信号的集合成功返回0,失败返回-1
int sigismember(const sigset_t *set,int signum); //查询signum是否在set中在返回1,不在返回0,错误返回-1
int sigaddset(sigset_t *set,int signum); //加signum到set中成功返回0,失败返回-1
int sigdelset(sigset_t *set,int signum); //从set中删除signum成功返回0,失败返回-1
int sigprocmask(int how,const sigset_t *set,sigset_t *oldset); //编辑阻塞集成功返回0,失败返回-1
SIG_BLOCK //添加set集合
SIG_UNBLOCK //删除set集合
SIG_SETMASK //设置为set集合
#include <unistd.h> //管道头文件
int pipe(int fd[2]); //创建pipe成功返回0,失败返回-1
void fcntl(fd,F_SETFL,0); //设置文件阻塞
O_NONBLOCK //设置文件非阻塞
int dup(int oldfd); //成功返回新文件描述符,失败返回-1
int dup2(int oldfd,int newfd); //强制分配并返回newfd失败返回-1
//close_on_exec 标志决定文件描述符在执行exec之后是否可用
int flags;
flags=fcntl(fd,F_GETFD); //获得标志
flags|=FD_CLOEXEC; //打开标志位
flags&=~FD_CLOEXEC; //关闭标志位
fcntl(fd,F_SETFD,flags); //设置标志
#include <sys/types.h>
#include <sys/stat.h> //mkfifo头文件
int mkfifo(const char *pathname,mode_t mode); //创建fifo成功返回0,文件已存在返回-1
//不指定NONBLOCK
//open只读打开FIFO阻塞至某进程为写打开FIFO
//open只写打开FIFO阻塞至某进程为读打开FIFO
//open以只读只写打开FIFO调用read阻塞
//通信中写退出read不阻塞写恢复read阻塞
//通信中读退出,写进程也退出
//缓冲区满时write阻塞
//open以可读可写打开FIFOopen不阻塞read阻塞缓冲区满时write阻塞
#include <sys/types.h>
#include <sys/ipc.h> //ftok头文件
key_t ftok(const char *pathname, int proj_id); //获取IPC键值成功返回key失败返回-1
#include <sys/msg.h> //msgget头文件
int msgget(key_t,int msgflg); //创建消息队列,成功返回消息队列标识符,失败返回-1
typedef struct
{
long mtype;
char mtext[100];
}MSG; //消息格式
int msgsnd(int msgid,const void *msgp,size_t msgsz,int msgflg); //添加消息到队列成功返回0,失败返回-1
ssize_t msgrcv(int msgid,void *msgp,size_t msgsz,long msgtyp,int msgflg); //接收消息,成功返回读取消息的长度,失败返回-1
int msgctl(int msgid,int cmd,struct msgid_ds *buf); //控制消息队列属性成功返回0,失败返回-1
IPC_RMID
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/shm.h> //共享内存头文件
int shmget(key_t key,size_t size,int shmflg); //创建或打开共享内存,成功返回共享内存标识符,失败返回-1
void *shmat(int shmid,const void *shmaddr,int shmflg); //映射,成功返回映射地址,失败返回-1
NULL 0
int shmdt(const void *shmaddr); //分离共享内存成功返回0,失败返回-1
int shmctl(int shmid,int cmd,struct shmid_ds *buf); //共享内存控制成功返回0,失败返回-1
IPC_RMID //删除
void *shmat(int shmid,const void *shmaddr,int shmflg); //映射,成功返回映射地址,失败返回-1
#include <pthread.h> //线程头文件,编译加参数 -lpthread
int pthread_create(pthread_t *thread,const thread_attr_t *attr,void *(*start_routine)(void *),void *arg); //创建线程
NULL
int pthread_join(pthread_t thread,void **retval); //等子进程结束回收资源成功返回0,失败返回非0,有阻塞
int pthread_detach(pthread_t thread); //独立线程终止时系统回收资源成功返回0,失败返回非0
//不终止进程的前提下终止线程
//1 线程从执行函数中返回
//2 线程调用pthread_exit
//3 被其他线程取消
void pthread_exit(void *retval); //退出线程
int pthread_cancel(pthread_t thread); //发送取消线程信号成功返回0,失败返回出错编号,无阻塞
pthread_setcancelstate(int state,int *old_state); //设置线程是否可被取消,默认是
PTHREAD_CANCEL_DISABLE //不可取消
PTHREAD_CANCEL_ENABEL //可以取消
//出现取消点的函数见posix*.bmp
void pthread_setcanceltype(int type,int *oldtype); //立即终止线程
PTHREAD_CANCEL_ASYNCHRONOUS //立即取消
PTHREAD_CANCEL_DEFERRED //不立即取消
void pthread_cleanup_push(void (*routine)(void *),void *arg); //注册线程清理函数
void pthread_cleanup_pop(int execute); //删除清理函数0==execute?不清理:清理
//调用清理函数
//1 调用pthread_exit退出线程
//2 相应其他线程取消要求
//3 非零execute调用pthread_cleanup_pop
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *arrt); //初始化互斥锁成功返回0,失败返回非0
NULL //默认属性
int pthread_mutex_lock(pthread_mutex_t *mutex); //上锁阻塞至解锁成功返回0,失败返回非0
int pthread_mutex_trylock(pthread_mutex_t *mutex); //上锁否则立即返回成功返回0,失败返回非0非阻塞
int pthread_mutex_unlock(pthread_mutex_t *mutex); //解锁成功返回0,失败非0
int pthread_mutex_destroy(pthread_mutex_t *mutex); //销毁锁成功返回0,失败返回非0
#include <semaphore.h> //信号量头文件
int sem_init(sem_t *sem,int pshared,unsigned int value); //创建初始化信号量成功返回0,失败返回-1
//pshared==0?线程:进程
//信号初始值
int sem_wait(sem_t *sem); //信号量值减1,小于0阻塞成功返回0,失败返回-1
int sem_trywait(sem_t *sem); //同上,不阻塞
int sem_post(sem_t *sem); //信号值加1等待唤醒阻塞成功返回0,失败返回-1
int sem_getvalue(sem_t *sem,int *sval); //sval保存sem标识成功返回0,失败返回-1
int sem_destroy(sem_t *sem); //删除信号量成功返回0,失败返回-1
//进程间通信一般用有名信号量
#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h> //有名信号量头文件
sem_t *sem_open(const char *name,int oflag,mode_t mode,unsigned int value); //创建信号量成功返回信号量地址失败返回SEM_FAILED
int sem_close(sem_t *sem); //关闭有名信号量成功返回0,失败返回-1
int sem_unlink(const char *name); //删除有名信号量文件成功返回0,失败返回-1