之前项目用到的函数汇总一下:
1.access
原型:int access(const char *filenpath, int mode);
头文件:io.h
功 能: 确定文件或文件夹的访问权限。检查某个文件的存取方式,比如说是只读方式、只写方式等。如果指定的存取方式有效,则函数返回0,否则函数返回-1。
用 法:
int access(const char *filenpath, int mode);
或者int _access( const char *path, int mode );
参数说明:filenpath文件或文件夹的路径,当前目录直接使用文件或文件夹名
备注:当该参数为文件的时候,access函数能使用mode参数所有的值,当该参数为文件夹的时候,access函数值能判断文件夹是否存在。在WIN NT 中,所有的文件夹都有读和写权限
mode要判断的模式,在头文件unistd.h中的预定义如下:
#define R_OK 4 /* Test for read permission. */
#define W_OK 2 /* Test for write permission. */
#define X_OK 1 /* Test for execute permission. */
#define F_OK 0 /* Test for existence. */
2.fopen
原型:fp=fopen("file a","r");
例如:
FILE *fp;
fp=fopen("file a","r");
其意义是在当前目录下打开文件file a,只允许进行“读”操作,并使fp指向该文件。
又如:
FILE *fphzk
fphzk=fopen("c:\\hzk16","rb");
其意义是打开C驱动器磁盘的根目录下的文件hzk16,这是一个二进制文件,只允许按二进制方式进行读操作。两个反斜线“\\ ”中的第一个表示转义字符,第二个表示根目录。
1) 文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是:
r(read): 只读
w(write): 只写
a(append): 追加
t(text): 文本文件,可省略不写
b(binary): 二进制文件
+: 读和写
2) 凡用“r”打开一个文件时,该文件必须已经存在,且只能从该文件读出。
3) 用“w”打开的文件只能向该文件写入。若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。
4) 若要向一个已存在的文件追加新的信息,只能用“a”方式打开文件。如果指定文件不存在则尝试创建该文件。
5) 在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。因此常用以下程序段打开文件:
6) if((fp=fopen("c:\\hzk16","rb"))==NULL)
{
printf("\nerror on open c:\\hzk16 file!");
getch();
exit(1);
}
这段程序的意义是,如果返回的指针为空,表示不能打开C盘根目录下的hzk16文件,则给出提示信息“error on open c:\ hzk16 file!”,下一行getch()的功能是从键盘输入一个字符,但不在屏幕上显示。在这里,该行的作用是等待,只有当用户从键盘敲任一键时,程序才继续执行,因此用户可利用这个等待时间阅读出错提示。敲键后执行exit(1)退出程序。
7) 把一个文本文件读入内存时,要将ASCII码转换成二进制码,而把文件以文本方式写入磁盘时,也要把二进制码转换成ASCII码,因此文本文件的读写要花费较多的转换时间。对二进制文件的读写不存在这种转换。
8) 标准输入文件(键盘),标准输出文件(显示器),标准出错输出(出错信息)是由系统打开的,可直接使用。
3. fgets
原型:char *fgets(char *buf, int bufsize, FILE *stream);
如果使用fgets()读取某个文件,第一次读取的bufsize为5,而文件的第一行有10个字符(算上'\n'),那么读取文件的指针会偏移至当前读取完的这个字符之后的位置。也就是第二次再用fgets()读取文件的时候,则会继续读取其后的字符。而,如果使用fgets() 读取文件的时候bufsize大于该行的字符总数加2(多出来的两个,一个保存文件本身的'\n'换行,一个保存字符串本身的结束标识'\0'),文件并不会继续读下去,仅仅只是这一行读取完,随后指向文件的指针会自动偏移至下一行。
4.atoi
原型:int atoi(const char *nptr);
是把字符串转换成整型数的一个函数
1 2 3 4 5 6 7 8 9 10 11 12 |
//vs2013里调用printf函数请使用预处理命令#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <stdio.h>
int main(void) { int n; char *str = "12345.67"; n = atoi(str); printf("n=%d\n",n); return 0; } |
(1)
输出:
n = 12345
(2)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//vs2013里调用printf函数请使用预处理命令#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <stdio.h>
int main() { char a[] = "-100"; char b[] = "123"; int c; c = atoi(a) + atoi(b); printf("c=%d\n", c); return 0; } |
执行结果:
c = 23
5.pthread_create
原型: int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,(void*)(*start_rtn)(void*),void *arg);
它的功能是创建线程(实际上就是确定调用该线程函数的入口点),在线程创建以后,就开始运行相关的线程函数。
第二个参数用来设置线程属性。
第三个参数是线程运行函数的起始地址。
最后一个参数是运行函数的参数。
头文件
|
#include<pthread.h> |
pthread_create的返回值 表示成功,返回0;表示出错,返回表示-1。
6. pthread_cond_timedwait
原型:int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime)
无论哪种等待方式,都必须和一个互斥锁配合,以防止多个线程同时请求pthread_cond_wait()(或pthread_cond_timedwait(),下同)的竞争条件(Race Condition)。mutex互斥锁必须是普通锁(PTHREAD_MUTEX_TIMED_NP)或者适应锁(PTHREAD_MUTEX_ADAPTIVE_NP),且在调用pthread_cond_wait()前必须由本线程加锁(pthread_mutex_lock()),而在更新条件等待队列以前,mutex保持锁定状态,并在线程挂起进入等待前解锁。在条件满足从而离开pthread_cond_wait()之前,mutex将被重新加锁,以与进入pthread_cond_wait()前的加锁动作对应。阻塞时处于解锁状态。
[参考]
1. https://www.cnblogs.com/qingxia/archive/2012/08/30/2663791.html
1. https://blog.csdn.net/whz_zb/article/details/6937673
7. pthread_mutex_lock
原型:int pthread_mutex_lock(pthread_mutex_t *mutex);
头文件:#include <pthread.h>
对于静态分配的互斥量, 可以把它设置为PTHREAD_MUTEX_INITIALIZER, 或者调用pthread_mutex_init.
对于动态分配的互斥量, 在申请内存(malloc)之后, 通过pthread_mutex_init进行初始化, 并且在释放内存(free)前需要调用pthread_mutex_destroy.
2. 互斥操作:
对共享资源的访问, 要对互斥量进行加锁, 如果互斥量已经上了锁, 调用线程会阻塞, 直到互斥量被解锁. 在完成了对共享资源的访问后, 要对互斥量进行解锁。
首先说一下加锁函数:
头文件:
原型:
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
返回值: 成功则返回0, 出错则返回错误编号.
[参考] https://blog.csdn.net/tennysonsky/article/details/46494077
8. fd_set
select()机制中提供一fd_set的数据结构,实际上是一long类型的数组,每一个数组元素都能与一打开的文件句柄(不管是socket句柄,还是其他文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成,当调用select()时,由内核根据IO状态修改fd_set的内容,由此来通知执行了select()的进程哪一socket或文件发生了可读或可写事件。
常见用法:
fd_set set;
FD_ZERO(&set); /*将set清零使集合中不含任何fd*/
FD_SET(fd, &set); /*将fd加入set集合*/
FD_CLR(fd, &set); /*将fd从set集合中清除*/
FD_ISSET(fd, &set); /*在调用select()函数后,用FD_ISSET来检测fd是否在set集合中,当检测到fd在set中则返回真,否则,返回假(0)*/
9.mkfifo
原型:int mkfifo(const char * pathname,mode_t mode);
头文件:#include<sys/types.h>
mkfifo ()会依参数pathname建立特殊的FIFO文件,该文件必须不存在。
10. open
作用:打开和创建文件。
#include<fcntl.h>
int open(constchar*pathname,intflags);
int open(constchar*pathname,intflags,mode_tmode);
返回值:成功则返回文件描述符,否则返回-1
O_RDONLY只读模式
O_WRONLY只写模式
O_RDWR读写模式
11.unlink
unlink 会删除文件名,并减少连接数。如果是最后一个连接并且没有进程打开文件,文件将会被删除,并释放空间。如果是最后一个连接但是有进程打开文件,文件仍会存在,直到打开的文件被关闭。
remove比unlink多了个删除目录的功能,在删除文件时,remove和unlink的功能是一样的。
12. sem_init
原型:int sem_init(sem_t *sem, int pshared, unsigned int value);
如果 pshared 的值为 0,那么信号量将被进程内的线程共享;如果 pshared 是非零值,那么信号量将在进程之间共享。
sem_init() 成功时返回 0;错误时,返回 -1,并把 errno 设置为合适的值。
第一个参数:信号量名 ;
第三个参数value表示可用的资源的数目。
[参考] https://blog.csdn.net/tomstrong_369/article/details/54312909
13. fcntl
通过fcntl可以改变已打开的文件性质。
O_NONBLOCK 如果pathname指的是一个FIFO文件、块设备文件或字符设备文件,则此选项将文件的本次打开操作和后续的I/O操作设置为非阻塞模式
14.pipe
每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。
#include <unistd.h>
int pipe (int fd[2]);
//返回:成功返回0,出错返回-1
fd参数返回两个文件描述符,fd[0]指向管道的读端,fd[1]指向管道的写端。fd[1]的输出是fd[0]的输入。
[参考]1. https://blog.csdn.net/skyroben/article/details/71513385
匿名管道(pipe)
只能是具有血缘关系的进程之间通信
命名管道(FIFO)
提供了一个路径名与之关联,以FIFO文件的形式存储于文件系统中,能够实现任何两个进程之间通信。而匿名管道对于文件系统是不可见的,它仅限于在父子进程之间的通信。
2. https://blog.csdn.net/qq_33951180/article/details/68959819
15. sem_post
原型:int sem_post(sem_t *sem);
头文件:#include <semaphore.h>
sem_post是给信号量的值加上一个“1”,它是一个“原子操作”---即同时对同一个信号量做加“1”操作的两个线程是不会冲突的;而同 时对同一个文件进行读和写操作的两个程序就有可能会引起冲突。
[参考]1.https://blog.csdn.net/fern_girl/article/details/61197995
2.https://blog.csdn.net/tietao/article/details/7367827
16. usleep
usleep()函数的功能是把调用该函数的线程挂起一段时间 [1] , 单位是微秒(microseconds:即百万分之一秒); 头文件: unistd.h 语法: void usleep(int micro_seconds); 返回值: 无 内容说明:本函数可暂时使程序停止执行。
17. pthread_join(pthread_detach)
在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死。在被其他线程回收之前,它的存储器资源(例如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放
[参考] https://blog.csdn.net/u014774781/article/details/48039441
18. readdir
读取目录函数
头文件:#include <sys/types.h> #include <dirent.h>
定义函数:struct dirent * readdir(DIR * dir);
[参考] http://c.biancheng.net/cpp/html/320.html
19.stat
头文件: #include <sys/stat.h>
#include <unistd.h>
定义函数: int stat(const char *file_name, struct stat *buf);
函数说明: 通过文件名filename获取文件信息,并保存在buf所指的结构体stat中
返回值: 执行成功则返回0,失败返回-1,错误代码存于errno
[参考] https://www.cnblogs.com/sylar5/p/6491033.html
20.S_ISDIR()函数
功能是判断一个路径是否为目录
struct stat sb;
if(stat(fpath, &sb) >= 0 && S_ISDIR(sb.st_mode) && depth == 1)
{
// trave_dir(file->d_name, depth + 1);
continue;
}
21. select()
select(),本函数用于确定一个或多个套接口的状态,对每一个套接口,调用者可查询它的可读性、可写性及错误状态信息,用fd_set结构来表示一组等待检查的套接口,在调用返回时,这个结构存有满足一定条件的套接口组的子集,并且select()返回满足条件的套接口的数目。有一组宏可用于对fd_set的操作,这些宏与Berkeley Unix软件中的兼容,但内部的表达是完全不同的。
#include <sys/select.h>
int select( int nfds, fd_set FAR* readfds, fd_set * writefds, fd_set * exceptfds, const struct timeval * timeout);
nfds:是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1,不能错!在 Windows中这个参数的值无所谓,可以设置不正确。
readfds:(可选)指针,指向一组等待可读性检查的套接口。
writefds:(可选)指针,指向一组等待可写性检查的套接口。
exceptfds:(可选)指针,指向一组等待错误检查的套接口。
timeout:select()最多等待时间,对阻塞操作则为NULL。
返回值:
select()调用返回处于就绪状态并且已经包含在fd_set结构中的描述字总数;如果超时则返回0;否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError获取相应错误代码。
当返回为-1时,所有描述符集清0。
当返回为0时,表示超时。
当返回为正数时,表示已经准备好的描述符数。
select()返回后,在3个描述符集里,依旧是1的位就是准备好的描述符。这也就是为什么,每次用select后都要用FD_ISSET的原因。
22. recvfrom
一般情况下:
send(),recv()用于TCP,sendto()及recvfrom()用于UDP
但是send(),recv()也可以用于UDP,sendto()及recvfrom()也可以用于TCP