206 lines
14 KiB
C
206 lines
14 KiB
C
//#######################################################################
|
||
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以可读可写打开FIFO,open不阻塞,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
|