您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > Linux应用程序中常用函数
Linux应用程序常用函数在linux应用程序设计中,通常不需要去了底层的驱动是怎么实现的,只需要利用系统提供的接口函数,就可以去访问底层设备。这篇文档是记录自己学习《嵌入式linux应用程序开发详解》,其中主要介绍在应用程序中一些常用函数,并通过实例来介绍这些函数的用法。其中主要介绍了基于文件IO的编程,例如打开关闭,读写等等;进程及进程间通信;最后介绍了基于网络的的socket编程。一:文件I/O编程通过上面的系统框图,可以发现,应用程序有两种方式进行系统调用,直接调用和通过C库函数调用,也即是利用linux系统提供的文件IO和标准C库函函数的IO来进行系统调用。先说说基于linux系统的文件IO操作。㈠不带缓存的文件IO操作1.open()函数功能描述:用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数。所需头文件:#includesys/types.h#includesys/stat.h#includefcntl.h函数原型:intopen(constchar*pathname,intflags,intperms)参数:pathname:被打开的文件名(可包括路径名如dev/ttyS0)flags:文件打开方式,O_RDONLY:以只读方式打开文件O_WRONLY:以只写方式打开文件O_RDWR:以读写方式打开文件O_CREAT:如果改文件不存在,就创建一个新的文件,并用第三个参数为其设置权限O_EXCL:如果使用O_CREAT时文件存在,则返回错误消息。这一参数可测试文件是否存在。此时open是原子操作,防止多个进程同时创建同一个文件O_NOCTTY:使用本参数时,若文件为终端,那么该终端不会成为调用open()的那个进程的控制终端O_TRUNC:若文件已经存在,那么会删除文件中的全部原有数据,并且设置文件大小为0O_APPEND:以添加方式打开文件,在打开文件的同时,文件指针指向文件的末尾,即将写入的数据添加到文件的末尾O_NONBLOCK:如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I/O操作设置非阻塞方式。O_SYNC:使每次write都等到物理I/O操作完成。O_RSYNC:read等待所有写入同一区域的写操作完成后再进行在open()函数中,falgs参数可以通过“|”组合构成,但前3个标准常量(O_RDONLY,O_WRONLY,和O_RDWR)不能互相组合。perms:被打开文件的存取权限,可以用两种方法表示,可以用一组宏定义:S_I(R/W/X)(USR/GRP/OTH),其中R/W/X表示读写执行权限,USR/GRP/OTH分别表示文件的所有者/文件所属组/其他用户,如S_IRUUR|S_IWUUR|S_IXUUR,(-rex------),也可用八进制800表示同样的权限返回值:成功:返回文件描述符失败:返回-12.close()函数功能描述:用于关闭一个被打开的的文件所需头文件:#includeunistd.h函数原型:intclose(intfd)参数:fd文件描述符函数返回值:0成功,-1出错3.read()函数功能描述:从文件读取数据。所需头文件:#includeunistd.h函数原型:ssize_tread(intfd,void*buf,size_tcount);参数:fd:将要读取数据的文件描述词。buf:指缓冲区,即读取的数据会被放到这个缓冲区中去。count:表示调用一次read操作,应该读多少数量的字符。返回值:返回所读取的字节数;0(读到EOF);-1(出错)。以下几种情况会导致读取到的字节数小于count:A.读取普通文件时,读到文件末尾还不够count字节。例如:如果文件只有30字节,而我们想读取100字节,那么实际读到的只有30字节,read函数返回30。此时再使用read函数作用于这个文件会导致read返回0。B.从终端设备(terminaldevice)读取时,一般情况下每次只能读取一行。C.从网络读取时,网络缓存可能导致读取的字节数小于count字节。D.读取pipe或者FIFO时,pipe或FIFO里的字节数可能小于count。E.从面向记录(record-oriented)的设备读取时,某些面向记录的设备(如磁带)每次最多只能返回一个记录。F.在读取了部分数据时被信号中断。读操作始于cfo。在成功返回之前,cfo增加,增量为实际读取到的字节数。4.write()函数功能描述:向文件写入数据。所需头文件:#includeunistd.h函数原型:ssize_twrite(intfd,void*buf,size_tcount);返回值:写入文件的字节数(成功);-1(出错)功能:write函数向filedes中写入count字节数据,数据来源为buf。返回值一般总是等于count,否则就是出错了。常见的出错原因是磁盘空间满了或者超过了文件大小限制。对于普通文件,写操作始于cfo。如果打开文件时使用了O_APPEND,则每次写操作都将数据写入文件末尾。成功写入后,cfo增加,增量为实际写入的字节数。5.lseek()函数功能描述:用于在指定的文件描述符中将将文件指针定位到相应位置。所需头文件:#includeunistd.h,#includesys/types.h函数原型:off_tlseek(intfd,off_toffset,intwhence);参数:fd;文件描述符offset:偏移量,每一个读写操作所需要移动的距离,单位是字节,可正可负(向前移,向后移)whence:SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小SEEK_CUR:当前位置为指针的位置,新位置为当前位置加上偏移量SEEK_END:当前位置为文件的结尾,新位置为文件大小加上偏移量的大小返回值:成功:返回当前位移失败:返回-1㈡标准IO操作下面的这图能很好的反映,用户通过文件IO和标准IO进行系统调用的区别。标准IO操作:标准I/O是ANSIC建立的一个标准I/O模型,是一个标准函数包和stdio.h头文件中的定义,具有一定的可移植性。文件IO操作:称之为不带缓存的IO(unbufferedI/O)。不带缓存指的是每个read,write都调用内核中的一个系统调用。也就是一般所说的低级I/O——操作系统提供的基本IO服务,与os绑定,特定于linix或unix平台。首先:两者一个显著的不同点在于,标准I/O默认采用了缓冲机制,比如调用fopen函数,不仅打开一个文件,而且建立了一个缓冲区(读写模式下将建立两个缓冲区),还创建了一个包含文件和缓冲区相关数据的数据结构。低级I/O一般没有采用缓冲,需要自己创建缓冲区,不过其实在linix或unix系统中,都是有使用称为内核缓冲的技术用于提高效率,读写调用是在内核缓冲区和进程缓冲区之间进行的数据复制。其次从操作的设备上来区分,文件I/O主要针对文件操作,读写硬盘等,它操作的是文件描述符,标准I/O针对的是控制台,打印输出到屏幕等,它操作的是字符流。对于不同设备得特性不一样,必须有不同api访问才最高效。标准IO的一些常用函数Fopen(),fclose(),fread(),fwrite();㈢如何避免竞争上面只是简单介绍文件操作的基本操作,如果当多个用户共同使用和操作一个文件时,就回导致对共享资源的的竞争,该怎么解决竞争呢?Linux最常用的办法就是给文件上锁。文件锁又包括建议性锁和强制性锁。实现上锁的方法有lock和fcntl,lock用于对文件施加建议性锁,而fcntl用于对文件施加强制性锁。同时,fcntl还能对文件的某一记录进行上锁,也就是记录锁,记录锁可以分为读取锁和写入锁,其中读取锁为共享锁,写入锁为互斥锁。intfcntl(intfd,intcmd,structflock*lock);fcntl()用来操作文件描述符的一些特性。参数fd代表欲设置的文件描述词,参数cmd代表欲操作的指令。有以下几种情况:F_DUPFD用来查找大于或等于参数arg的最小且仍未使用的文件描述词,并且复制参数fd的文件描述词。执行成功则返回新复制的文件描述词。请参考dup2()。F_GETFD取得close-on-exec旗标。若此旗标的FD_CLOEXEC位为0,代表在调用exec()相关函数时文件将不会关闭。F_SETFD设置close-on-exec旗标。该旗标以参数arg的FD_CLOEXEC位决定。F_GETFL取得文件描述词状态旗标,此旗标为open()的参数flags。F_SETFL设置文件描述词状态旗标,参数arg为新旗标,但只允许O_APPEND、O_NONBLOCK和O_ASYNC位的改变,其他位的改变将不受影响。F_GETLK取得文件锁定的状态。F_SETLK设置文件锁定的状态。此时flcok结构的l_type值必须是F_RDLCK、F_WRLCK或F_UNLCK。如果无法建立锁定,则返回-1,错误代码为EACCES或EAGAIN。F_SETLKWF_SETLK作用相同,但是无法建立锁定时,此调用会一直等到锁定动作成功为止。若在等待锁定的过程中被信号中断时,会立即返回-1,错误代码为EINTR。参数lock指针为flock结构指针,定义如下structflcok{shortintl_type;shortintl_whence;off_tl_start;off_tl_len;pid_tl_pid;};l_type有三种状态:F_RDLCK建立一个供读取用的锁定F_WRLCK建立一个供写入用的锁定F_UNLCK删除之前建立的锁定l_whence也有三种方式:SEEK_SET以文件开头为锁定的起始位置。SEEK_CUR以目前文件读写位置为锁定的起始位置SEEK_END以文件结尾为锁定的起始位置。返回值成功则返回0,若有错误则返回-1,错误原因存于errno.Fcntl实例#includesys/types.h#includesys/stat.h#includesys/file.h#includeunistd.h#includestdio.h#includestdlib.h/*利用fcntl创建记录锁*/voidlock_set(intfd,inttype){structflocklock;lock.l_whence=SEEK_SET;lock.l_len=0;lock.l_start=0;while(1){lock.l_type=type;/*根据不同的type给文件上锁*/if((fcntl(fd,F_SETLK,&lock))==0){if(lock.l_type==F_RDLCK)printf(readlockissetby%d\n,getpid());elseif(lock.l_type==F_WRLCK)printf(writelockissetby%d\n,getpid());elseif(lock.l_type==F_UNLCK)printf(releaselockissetby%d\n,getpid());return;}/*判断文件是否可以上锁*/fcntl(fd,F_GETLK,&lock);if(lock.l_type!=F_UNLCK){if(lock.l_type==F_RDLCK)/*该文件已有读入琐*/printf(readlockissetby%d\n,lock.l_pid);elseif(lock.l_type==F_WRLCK)/*该文件已有写入锁*/printf(writelockalreadysetby%d\n,lock.l_pid);}}}intmain(void){intfd;fd=open(/home/fany/application/io/hello.c,O_RDWR,0666);if(fd0){perror(op
本文标题:Linux应用程序中常用函数
链接地址:https://www.777doc.com/doc-4465111 .html