Linux C编程一些函数汇总

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pengshengli/article/details/85093727

 

之前项目用到的函数汇总一下:

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_joinpthread_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

 

猜你喜欢

转载自blog.csdn.net/pengshengli/article/details/85093727
今日推荐