(一)文件操做篇
一、creat(创建文件)
头文件
1 #include 2 #include 3 #include
定义函数
1 int creat(const char * pathname, mode_tmode);
函数说明
参数pathname指向欲创建的文件路径字符串。creat()至关于使用下列的调用方式调用open()
1 open(const char * pathname ,(O_CREAT|O_WRONLY|O_TRUNC));
错误代码
关于参数mode请参考open()函数。
返回值
creat()会返回新的文件描述词,如有错误发生则会返回-1,并把错误代码设给errno。
EEXIST 参数pathname所指的文件已存在。
EACCESS 参数pathname 所指定的文件不符合所要求测试的权限
EROFS 欲打开写入权限的文件存在于只读文件系统内
EFAULT 参数pathname 指针超出可存取的内存空间
EINVAL 参数mode 不正确。
ENAMETOOLONG 参数pathname太长。
ENOTDIR 参数pathname为一目录
ENOMEM 核心内存不足
ELOOP 参数pathname有过多符号链接问题。
EMFILE 已达到进程可同时打开的文件数上限
ENFILE 已达到系统可同时打开的文件数上限
附加说明
creat()没法创建特别的装置文件,若是须要请使用mknod()。
二、open(打开文件)
头文件
1 #include 2 #include 3 #include
定义函数
1 int open( const char * pathname, int flags); 2 int open( const char * pathname,int flags, mode_t mode);
函数说明
参数pathname 指向欲打开的文件路径字符串。下列是参数flags 所能使用的旗标:
O_RDONLY 以只读方式打开文件
O_WRONLY 以只写方式打开文件
O_RDWR 以可读写方式打开文件。上述三种旗标是互斥的,也就是不可同时使用,但可与下列的旗标利用OR(|)运算符组合。
O_CREAT 若欲打开的文件不存在则自动创建该文件。
O_EXCL 若是O_CREAT 也被设置,此指令会去检查文件是否存在。文件若不存在则创建该文件,不然将致使打开文件错误。此外,若O_CREAT与O_EXCL同时设置,而且欲打开的文件为符号链接,则会打开文件失败。
O_NOCTTY 若是欲打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机。
O_TRUNC 若文件存在而且以可写的方式打开时,此旗标会令文件长度清为0,而原来存于该文件的资料也会消失。
O_APPEND 当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。
O_NONBLOCK 以不可阻断的方式打开文件,也就是不管有无数据读取或等待,都会当即返回进程之中。
O_NDELAY 同O_NONBLOCK。
O_SYNC 以同步的方式打开文件。
O_NOFOLLOW 若是参数pathname 所指的文件为一符号链接,则会令打开文件失败。
O_DIRECTORY 若是参数pathname 所指的文件并不是为一目录,则会令打开文件失败。
此为Linux2.2之后特有的旗标,以免一些系统安全问题。参数mode 则有下列数种组合,只有在创建新文件时才会生效,此外真正建文件时的权限会受到umask值所影响,所以该文件权限应该为(mode-umaks)。
S_IRWXU00700 权限,表明该文件全部者具备可读、可写及可执行的权限。
S_IRUSR 或S_IREAD,00400权限,表明该文件全部者具备可读取的权限。
S_IWUSR 或S_IWRITE,00200 权限,表明该文件全部者具备可写入的权限。
S_IXUSR 或S_IEXEC,00100 权限,表明该文件全部者具备可执行的权限。
S_IRWXG 00070权限,表明该文件用户组具备可读、可写及可执行的权限。
S_IRGRP 00040 权限,表明该文件用户组具备可读的权限。
S_IWGRP 00020权限,表明该文件用户组具备可写入的权限。
S_IXGRP 00010 权限,表明该文件用户组具备可执行的权限。
S_IRWXO 00007权限,表明其余用户具备可读、可写及可执行的权限。
S_IROTH 00004 权限,表明其余用户具备可读的权限
S_IWOTH 00002权限,表明其余用户具备可写入的权限。
S_IXOTH 00001 权限,表明其余用户具备可执行的权限。
返回值
若全部欲核查的权限都经过了检查则返回0 值,表示成功,只要有一个权限被禁止则返回-1。
错误代码
EEXIST 参数pathname 所指的文件已存在,却使用了O_CREAT和O_EXCL旗标。
EACCESS 参数pathname所指的文件不符合所要求测试的权限。
EROFS 欲测试写入权限的文件存在于只读文件系统内。
EFAULT 参数pathname指针超出可存取内存空间。
EINVAL 参数mode 不正确。
ENAMETOOLONG 参数pathname太长。
ENOTDIR 参数pathname不是目录。
ENOMEM 核心内存不足。
ELOOP 参数pathname有过多符号链接问题。
EIO I/O 存取错误
三、close(关闭文件)
头文件
1 #include
定义函数
1 int close(int fd);
函数说明
当使用完文件后若已再也不须要则可以使用close()关闭该文件,二close()会让数据写回磁盘,并释放该文件所占用的资源。参数fd为先前由open()或creat()所返回的文件描述词。
返回值
若文件顺利关闭则返回0,发生错误时返回-1。
错误代码
EBADF 参数fd 非有效的文件描述词或该文件已关闭。
附加说明
虽然在进程结束时,系统会自动关闭已打开的文件,但仍建议自行关闭文件,并确实检查返回值。
四、read(由已打开的文件读取数据)
头文件
1 #include
定义函数
1 ssize_t read(int fd,void * buf ,size_t count);
函数说明
read()会把参数fd 所指的文件传送count个字节到buf指针所指的内存中。若参数count为0,则read()不会有做用并返回0。返回值为实际读取到的字节数,若是返回0,表示已到达文件尾或是无可读取的数据,此外文件读写位置会随读取到的字节移动。
附加说明
如 果顺利read()会返回实际读到的字节数,最好能将返回值与参数count 做比较,若返回的字节数比要求读取的字节数少,则有可能读到了文件尾、从管道(pipe)或终端机读取,或者是read()被信号中断了读取动做。当有错 误发生时则返回-1,错误代码存入errno中,而文件读写位置则没法预期。
错误代码
EINTR 此调用被信号所中断。
EAGAIN 当使用不可阻断I/O 时(O_NONBLOCK),若无数据可读取则返回此值。
EBADF 参数fd 非有效的文件描述词,或该文件已关闭。
五、write(将数据写入已打开的文件内)
头文件
1 #include
定义函数
1 ssize_t write (int fd,const void * buf,size_t count);
函数说明
write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内。固然,文件读写位置也会随之移动。
返回值
若是顺利write()会返回实际写入的字节数。当有错误发生时则返回-1,错误代码存入errno中。
错误代码
EINTR 此调用被信号所中断。
EAGAIN 当使用不可阻断I/O 时(O_NONBLOCK),若无数据可读取则返回此值。
EADF 参数fd非有效的文件描述词,或该文件已关闭。
六、flock(锁定文件或解除锁定)
头文件
1 #include
定义函数
1 int flock(int fd,int operation);
函数说明
flock()会依参数operation所指定的方式对参数fd所指的文件作各类锁定或解除锁定的动做。此函数只能锁定整个文件,没法锁定文件的某一区域。
参数
operation有下列四种状况:
LOCK_SH 创建共享锁定。多个进程可同时对同一个文件做共享锁定。
LOCK_EX 创建互斥锁定。一个文件同时只有一个互斥锁定。
LOCK_UN 解除文件锁定状态。
LOCK_NB 没法创建锁定时,此操做可不被阻断,立刻返回进程。一般与LOCK_SH或LOCK_EX 作OR(|)组合。
单一文件没法同时创建共享锁定和互斥锁定,而当使用dup()或fork()时文件描述词不会继承此种锁定。
返回值
返回0表示成功,如有错误则返回-1,错误代码存于errno。
七、lseek(移动文件的读写位置)
头文件
1 #include 2 #include
定义函数
1 off_t lseek(int fildes,off_t offset ,int whence);
函数说明
每个已打开的文件都有一个读写位 置,当打开文件时一般其读写位置是指向文件开头,如果以附加的方式打开文件(如O_APPEND),则读写位置会指向文件尾。当read()或 write()时,读写位置会随之增长,lseek()即是用来控制该文件的读写位置。参数fildes 为已打开的文件描述词,参数offset 为根据参数whence来移动读写位置的位移数。
参数
whence为下列其中一种:
SEEK_SET 参数offset即为新的读写位置。
SEEK_CUR 以目前的读写位置日后增长offset个位移量。
SEEK_END 将读写位置指向文件尾后再增长offset个位移量。
当whence 值为SEEK_CUR 或SEEK_END时,参数offet容许负值的出现。
下列是教特别的使用方式:
1) 欲将读写位置移到文件开头时:lseek(int fildes,0,SEEK_SET);
2) 欲将读写位置移到文件尾时:lseek(int fildes,0,SEEK_END);
3) 想要取得目前文件位置时:lseek(int fildes,0,SEEK_CUR);
返回值
当调用成功时则返回目前的读写位置,也就是距离文件开头多少个字节。如有错误则返回-1,errno 会存放错误代码。
附加说明
Linux系统不容许lseek()对tty装置做用,此项动做会令lseek()返回ESPIPE。
八、fcntl(文件描述词操做)
头文件
1 #include 2 #include
定义函数
1 int fcntl(int fd , int cmd); 2 int fcntl(int fd,int cmd,long arg); 3 int fcntl(int fd,int cmd,struct flock * 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_SETLKW F_SETLK 做用相同,可是没法创建锁定时,此调用会一直等到锁定动做成功为止。若在等待锁定的过程当中被信号中断时,会当即返回-1,错误代码为EINTR。参数lock指针为flock 结构指针,定义以下
复制代码
1 struct flcok 2 { 3 short int l_type; /* 锁定的状态*/ 4 short int l_whence;/*决定l_start位置*/ 5 off_t l_start; /*锁定区域的开头位置*/ 6 off_t l_len; /*锁定区域的大小*/ 7 pid_t l_pid; /*锁定动做的进程*/ 8 };
复制代码
l_type 有三种状态:
F_RDLCK 创建一个供读取用的锁定
F_WRLCK 创建一个供写入用的锁定
F_UNLCK 删除以前创建的锁定
l_whence 也有三种方式:
SEEK_SET 以文件开头为锁定的起始位置。
SEEK_CUR 以目前文件读写位置为锁定的起始位置
SEEK_END 以文件结尾为锁定的起始位置。
返回值
成功则返回0,如有错误则返回-1,错误缘由存于errno.
九、fgets(由文件中读取一字符串)
头文件
1 include
定义函数
1 char * fgets(char * s,int size,FILE * stream);
函数说明
fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,直到出现换行字符、读到文件尾或是已读了size-1个字符为止,最后会加上NULL做为字符串结束。
返回值
gets()若成功则返回s指针,返回NULL则表示有错误发生。
十、fputs(将一指定的字符串写入文件内)
头文件
1 #include
定义函数
1 int fputs(const char * s,FILE * stream);
函数说明
fputs()用来将参数s所指的字符串写入到参数stream所指的文件内。
返回值
若成功则返回写出的字符个数,返回EOF则表示有错误发生。
(二)内存控制篇
一、calloc(配置内存空间)
头文件
1 #include
定义函数
1 void *calloc(size_t nmemb,size_t size);
函数说明
calloc()用来配置nmemb个相邻的内存单位,每一单位的大小为size,并返回指向第一个元素的指针。这和使用下列的方式效果相同:malloc(nmemb*size);不过,在利用calloc()配置内存时会将内存内容初始化为0。
返回值
若配置成功则返回一指针,失败则返回NULL。
二、free(释放原先配置的内存)
头文件
1 #include
定义函数
1 void free(void *ptr);
函数说明
参数ptr为指向先前由 malloc()、calloc()或realloc()所返回的内存指针。调用free()后ptr所指的内存空间便会被收回。倘若参数ptr所指的内 存空间已被收回或是未知的内存地址,则调用free()可能会有没法预期的状况发生。若参数ptr为NULL,则free()不会有任何做用。
三、malloc(配置内存空间)
头文件
1 #include
定义函数
1 void * malloc(size_t size);
函数说明
malloc()用来配置内存空间,其大小由指定的size决定。
返回值
若配置成功则返回一指针,失败则返回NULL。
范例
void p = malloc(1024); /*配置1k的内存*/
(三)进程操做篇
一、execl(执行文件)
头文件
1 #include
定义函数
1 int execl(const char * path,const char * arg,....);
函数说明
execl()用来执行参数path字符串所表明的文件路径,接下来的参数表明执行该文件时传递过去的argv(0)、argv[1]……,最后一个参数必须用空指针(NULL)做结束。
返回值
若是执行成功则函数不会返回,执行失败则直接返回-1,失败缘由存于errno中。
二、execlp(从PATH 环境变量中查找文件并执行)
头文件
#include
定义函数
1 int execlp(const char * file,const char * arg,……);
函数说明
execlp()会从PATH 环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,而后将第二个之后的参数当作该文件的argv[0]、argv[1]……,最后一个参数必须用空指针(NULL)做结束。
返回值
若是执行成功则函数不会返回,执行失败则直接返回-1,失败缘由存于errno 中。
错误代码
参考execve()。
三、execv(执行文件)
头文件
1 #include
定义函数
1 int execv (const char * path, char * const argv[ ]);
函数说明
execv()用来执行参数path字符串所表明的文件路径,与execl()不一样的地方在于execve()只需两个参数,第二个参数利用数组指针来传递给执行文件。
返回值
若是执行成功则函数不会返回,执行失败则直接返回-1,失败缘由存于errno 中。
错误代码
请参考execve()。
四、execve(执行文件)
头文件
1 #include
定义函数
1 int execve(const char * filename,char * const argv[ ],char * const envp[ ]);
函数说明
execve()用来执行参数filename字符串所表明的文件路径,第二个参数系利用数组指针来传递给执行文件,最后一个参数则为传递给执行文件的新环境变量数组。
返回值
若是执行成功则函数不会返回,执行失败则直接返回-1,失败缘由存于errno 中。
错误代码
EACCES
1. 欲执行的文件不具备用户可执行的权限。
2. 欲执行的文件所属的文件系统是以noexec 方式挂上。
3.欲执行的文件或script翻译器非通常文件。
EPERM
1.进程处于被追踪模式,执行者并不具备root权限,欲执行的文件具备SUID 或SGID 位。
2.欲执行的文件所属的文件系统是以nosuid方式挂上,欲执行的文件具备SUID 或SGID 位元,但执行者并不具备root权限。
E2BIG 参数数组过大
ENOEXEC 没法判断欲执行文件的执行文件格式,有多是格式错误或没法在此平台执行。
EFAULT 参数filename所指的字符串地址超出可存取空间范围。
ENAMETOOLONG 参数filename所指的字符串太长。
ENOENT 参数filename字符串所指定的文件不存在。
ENOMEM 核心内存不足
ENOTDIR 参数filename字符串所包含的目录路径并不是有效目录
EACCES 参数filename字符串所包含的目录路径没法存取,权限不足
ELOOP 过多的符号链接
ETXTBUSY 欲执行的文件已被其余进程打开并且正把数据写入该文件中
EIO I/O 存取错误
ENFILE 已达到系统所容许的打开文件总数。
EMFILE 已达到系统所容许单一进程所能打开的文件总数。
EINVAL 欲执行文件的ELF执行格式不仅一个PT_INTERP节区
EISDIR ELF翻译器为一目录
ELIBBAD ELF翻译器有问题。
五、execvp(执行文件)
头文件
1 #include
定义函数
1 int execvp(const char *file ,char * const argv []);
函数说明
execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,而后将第二个参数argv传给该欲执行的文件。
返回值
若是执行成功则函数不会返回,执行失败则直接返回-1,失败缘由存于errno中。
错误代码
请参考execve()。
六、exit(正常结束进程)
头文件
1 #include
定义函数
1 void exit(int status);
函数说明
exit()用来正常终结目前进程的执行,并把参数status返回给父进程,而进程全部的缓冲区数据会自动写回并关闭未关闭的文件。
七、_exit(结束进程执行)
头文件
1 #include
定义函数
1 void _exit(int status);
函数说明
_exit()用来马上结束目前进程的执行,并把参数status返回给父进程,并关闭未关闭的文件。此函数调用后不会返回,而且会传递SIGCHLD信号给父进程,父进程能够由wait函数取得子进程结束状态。
附加说明
_exit()不会处理标准I/O 缓冲区,如要更新缓冲区请使用exit()。
八、vfork(创建一个新的进程)
头文件
1 #include
定义函数
1 pid_t vfork(void);
函数说明
vfork()会产生一个新的子进 程,其子进程会复制父进程的数据与堆栈空间,并继承父进程的用户代码,组代码,环境变量、已打开的文件代码、工做目录和资源限制等。Linux 使用copy-on-write(COW)技术,只有当其中一进程试图修改欲复制的空间时才会作真正的复制动做,因为这些继承的信息是复制而来,并不是指相 同的内存空间,所以子进程对这些变量的修改和父进程并不会同步。此外,子进程不会继承父进程的文件锁定和未处理的信号。注意,Linux不保证子进程会比 父进程先执行或晚执行,所以编写程序时要留意
死锁或竞争条件的发生。
返回值
若是vfork()成功则在父进程会返回新创建的子进程代码(PID),而在新创建的子进程中则返回0。若是vfork 失败则直接返回-1,失败缘由存于errno中。
错误代码
EAGAIN 内存不足。ENOMEM 内存不足,没法配置核心所需的数据结构空间。
九、getpid(取得进程识别码)
头文件
1 #include
定义函数
1 pid_t getpid(void);
函数说明
getpid()用来取得目前进程的进程识别码,许多程序利用取到的此值来创建临时文件,以免临时文件相同带来的问题。
返回值
目前进程的进程识别码
十、getppid(取得父进程的进程识别码)
头文件
1 #include
定义函数
1 pid_t getppid(void);
函数说明
getppid()用来取得目前进程的父进程识别码。
返回值
目前进程的父进程识别码。
十一、wait(等待子进程中断或结束)
头文件
1 #include 2 #include
定义函数
1 pid_t wait (int * status);
函数说明
wait()会暂时中止目前进程的执行,直到有信号来到或子进程结束。若是在调用wait()时子进程已经结束,则wait()会当即返回子进程结束状态值。子进程的结束状态值会由参数status 返回,而子进程的进程识别码也会一快返回。若是不在乎结束状态值,则
参数
status能够设成NULL。子进程的结束状态值请参考waitpid()。
返回值
若是执行成功则返回子进程识别码(PID),若是有错误发生则返回-1。失败缘由存于errno中。
十二、waitpid(等待子进程中断或结束)
头文件
1 #include 2 #include
定义函数
1 pid_t waitpid(pid_t pid,int * status,int options);
函数说明
waitpid()会暂时中止目前 进程的执行,直到有信号来到或子进程结束。若是在调用wait()时子进程已经结束,则wait()会当即返回子进程结束状态值。子进程的结束状态值会由 参数status返回,而子进程的进程识别码也会一快返回。若是不在乎结束状态值,则参数status能够设成 NULL。参数pid为欲等待的子进程识别码,其余数值意义以下:
pid<-1 等待进程组识别码为pid绝对值的任何子进程。
pid=-1 等待任何子进程,至关于wait()。
pid=0 等待进程组识别码与目前进程相同的任何子进程。
pid>0 等待任何子进程识别码为pid的子进程。
参数option能够为0 或下面的OR 组合
WNOHANG 若是没有任何已经结束的子进程则立刻返回,不予以等待。
WUNTRACED 若是子进程进入暂停执行状况则立刻返回,但结束状态不予以理会。
子进程的结束状态返回后存于status,底下有几个宏可判别结束状况
WIFEXITED(status)若是子进程正常结束则为非0值。
WEXITSTATUS(status)取得子进程exit()返回的结束代码,通常会先用WIFEXITED 来判断是否正常结束才能使用此宏。
WIFSIGNALED(status)若是子进程是由于信号而结束则此宏值为真
WTERMSIG(status)取得子进程因信号而停止的信号代码,通常会先用WIFSIGNALED 来判断后才使用此宏。
WIFSTOPPED(status)若是子进程处于暂停执行状况则此宏值为真。通常只有使用WUNTRACED 时才会有此状况。
WSTOPSIG(status)取得引起子进程暂停的信号代码,通常会先用WIFSTOPPED 来判断后才使用此宏。
返回值
若是执行成功则返回子进程识别码(PID),若是有错误发生则返回-1。失败缘由存于errno中。
(四)信号处理篇
一、sigaction(查询或设置信号处理方式)
头文件
1 #include
定义函数
1 int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);
函数说明
sigaction()会依参数signum指定的信号编号来设置该信号的处理函数。参数signum能够指定SIGKILL和SIGSTOP之外的全部信号。
如参数结构sigaction定义以下
复制代码
1 struct sigaction 2 { 3 void (*sa_handler) (int); 4 sigset_t sa_mask; 5 int sa_flags; 6 void (*sa_restorer) (void); 7 }
复制代码
sa_handler此参数和signal()的参数handler相同,表明新的信号处理函数,其余意义请参考signal()。
sa_mask 用来设置在处理该信号时暂时将sa_mask 指定的信号搁置。
sa_restorer 此参数没有使用。
sa_flags 用来设置信号处理的其余相关操做,下列的数值可用。
OR 运算(|)组合
A_NOCLDSTOP : 若是参数signum为SIGCHLD,则当子进程暂停时并不会通知父进程
SA_ONESHOT/SA_RESETHAND:当调用新的信号处理函数前,将此信号处理方式改成系统预设的方式。
SA_RESTART:被信号中断的系统调用会自行重启
SA_NOMASK/SA_NODEFER:在处理此信号未结束前不理会此信号的再次到来。
若是参数oldact不是NULL指针,则原来的信号处理方式会由此结构sigaction 返回。
返回值
执行成功则返回0,若是有错误则返回-1。
错误代码
EINVAL 参数signum 不合法, 或是企图拦截SIGKILL/SIGSTOPSIGKILL信号
EFAULT 参数act,oldact指针地址没法存取。
EINTR 此调用被中断
二、sigaddset(增长一个信号至信号集)
头文件
1 #include
定义函数
1 int sigaddset(sigset_t *set,int signum);
函数说明
sigaddset()用来将参数signum 表明的信号加入至参数set 信号集里。
返回值
执行成功则返回0,若是有错误则返回-1。
错误代码
EFAULT 参数set指针地址没法存取
EINVAL 参数signum非合法的信号编号
三、sigdelset(从信号集里删除一个信号)
头文件
1 #include
定义函数
1 int sigdelset(sigset_t * set,int signum);
函数说明
sigdelset()用来将参数signum表明的信号从参数set信号集里删除。
返回值
执行成功则返回0,若是有错误则返回-1。
错误代码
EFAULT 参数set指针地址没法存取
EINVAL 参数signum非合法的信号编号
四、sigemptyset(初始化信号集)
头文件
1 #include
定义函数
1 int sigemptyset(sigset_t *set);
函数说明
sigemptyset()用来将参数set信号集初始化并清空。
返回值
执行成功则返回0,若是有错误则返回-1。
错误代码
EFAULT 参数set指针地址没法存取
五、sigfillset(将全部信号加入至信号集)
头文件
1 #include
定义函数
1 int sigfillset(sigset_t * set);
函数说明
sigfillset()用来将参数set信号集初始化,而后把全部的信号加入到此信号集里。
返回值
执行成功则返回0,若是有错误则返回-1。
附加说明
EFAULT 参数set指针地址没法存取
六、sigismember(测试某个信号是否已加入至信号集里)
头文件
1 #include
定义函数
1 int sigismember(const sigset_t *set,int signum);
函数说明
sigismember()用来测试参数signum 表明的信号是否已加入至参数set信号集里。若是信号集里已有该信号则返回1,不然返回0。
返回值
信号集已有该信号则返回1,没有则返回0。若是有错误则返回-1。
错误代码
EFAULT 参数set指针地址没法存取
EINVAL 参数signum 非合法的信号编号
七、signal(设置信号处理方式)
头文件
1 #include
定义函数
1 void (*signal(int signum,void(* handler)(int)))(int);
函数说明
signal()会依参数signum 指定的信号编号来设置该信号的处理函数。当指定的信号到达时就会跳转到参数handler指定的函数执行。若是
参数handler不是函数指针,则必须是下列两个常数之一:
SIG_IGN 忽略参数signum指定的信号。
SIG_DFL 将参数signum 指定的信号重设为核心预设的信号处理方式。
关于信号的编号和说明,请参考附录D
返回值
返回先前的信号处理函数指针,若是有错误则返回SIG_ERR(-1)。
附加说明
在信号发生跳转到自定的handler处理函数执行后,系统会自动将此处理函数换回原来系统预设的处理方式,若是要改变此操做请改用
sigaction()。
八、sleep(让进程暂停执行一段时间)
头文件
1 #include
定义函数
1 unsigned int sleep(unsigned int seconds);
函数说明
sleep()会令目前的进程暂停,直到达到参数seconds 所指定的时间,或是被信号所中断。
返回值
若进程暂停到参数seconds 所指定的时间则返回0,如有信号中断则返回剩余秒数。
九、perror(打印出错误缘由信息字符串)
头文件
1 #include
定义函数
1 void perror(const char *s);
函数说明
perror()用来将上一个函数发生错误的缘由输出到标准错误(stderr)。参数s所指的字符串会先打印出,后面再加上错误缘由字符串。此
错误缘由依照全局变量errno的值来决定要输出的字符串。
返回值
十、mkfifo(创建具名管道)
头文件
1 #include 2 #include
定义函数
1 int mkfifo(const char * pathname,mode_t mode);
函数说明
mkfifo()会依参数pathname创建特殊的FIFO文件,该文件必须不存在,而参数mode为该文件的权限(mode%~umask),所以 umask值也会
影响到FIFO文件的权限。Mkfifo()创建的FIFO文件其余进程均可以用读写通常文件的方式存取。当使用open()来打开 FIFO文件时,
O_NONBLOCK旗标会有影响
一、当使用O_NONBLOCK 旗标时,打开FIFO 文件来读取的操做会马上返回,可是若尚未其余进程打开FIFO 文件来读取,则写入的操做会
返回ENXIO 错误代码。
二、没有使用O_NONBLOCK 旗标时,打开FIFO 来读取的操做会等到其余进程打开FIFO文件来写入才正常返回。一样地,打开FIFO文件来写
入的操做会等到其余进程打开FIFO 文件来读取后才正常返回。
返回值
若成功则返回0,不然返回-1,错误缘由存于errno中。
错误代码
EACCESS 参数pathname所指定的目录路径无可执行的权限
EEXIST 参数pathname所指定的文件已存在。
ENAMETOOLONG 参数pathname的路径名称太长。
ENOENT 参数pathname包含的目录不存在
ENOSPC 文件系统的剩余空间不足
ENOTDIR 参数pathname路径中的目录存在但却非真正的目录。
EROFS 参数pathname指定的文件存在于只读文件系统内。
十一、pclose(关闭管道I/O)
头文件
1 #include
定义函数
1 int pclose(FILE * stream);
函数说明
pclose()用来关闭由popen所创建的管道及文件指针。参数stream为先前由popen()所返回的文件指针。
返回值
返回子进程的结束状态。若是有错误则返回-1,错误缘由存于errno中。
错误代码
ECHILD pclose()没法取得子进程的结束状态。
十二、pipe(创建管道)
头文件
1 #include
定义函数
1 int pipe(int filedes[2]);
函数说明
pipe()会创建管道,并将文件描述词由参数filedes数组返回。filedes[0]为管道里的读取端,filedes[1]则为管道的写入端。
返回值
若成功则返回零,不然返回-1,错误缘由存于errno中。
错误代码
EMFILE 进程已用完文件描述词最大量。
ENFILE 系统已无文件描述词可用。
EFAULT 参数filedes数组地址不合法。
1三、popen(创建管道I/O)
头文件
1 #include
定义函数
1 FILE * popen( const char * command,const char * type);
函数说明
popen()会调用fork()产生子进程,而后从子进程中调用/bin/sh -c来执行参数command的指令。参数type可以使用“r”表明读取,“w”代
表写入。依照此type值,popen()会创建管道连到子进程的标准输出设备或标准输入设备,而后返回一个文件指针。随后进程即可利用此
文件指针来读取子进程的输出设备或是写入到子进程的标准输入设备中。此外,全部使用文件指针(FILE*)操做的函数也均可以使用,除
了fclose()之外。
返回值
若成功则返回文件指针,不然返回NULL,错误缘由存于errno中。
错误代码
EINVAL参数type不合法。
注意事项
在编写具SUID/SGID权限的程序时请尽可能避免使用popen(),popen()会继承环境变量,经过环境变量可能会形成系统安全的问题。
(五)接口处理篇
一、accept(接受socket连线)
头文件
1 #include 2 #include
定义函数
1 int accept(int s,struct sockaddr * addr,int * addrlen);
函数说明
accept()用来接受参数s的socket连线。参数s的socket必需先经bind()、listen()函数处理过,当有连线进来时 accept()会返回一个新的
socket处理代码,日后的数据传送与读取就是经由新的socket处理,而原来参数s的socket能继续使用 accept()来接受新的连线要求。连
线成功时,参数addr所指的结构会被系统填入远程主机的地址数据,参数addrlen为scokaddr的结构长度。关于结构sockaddr的定义请参
考bind()。
返回值
成功则返回新的socket处理代码,失败返回-1,错误缘由存于errno中。
错误代码
EBADF 参数s 非合法socket处理代码。
EFAULT 参数addr指针指向没法存取的内存空间。
ENOTSOCK 参数s为一文件描述词,非socket。
EOPNOTSUPP 指定的socket并不是SOCK_STREAM。
EPERM 防火墙拒绝此连线。
ENOBUFS 系统的缓冲内存不足。
ENOMEM 核心内存不足。
二、bind(对socket定位)
头文件
1 #include 2 #include
定义函数
1 int bind(int sockfd,struct sockaddr * my_addr,int addrlen);
函数说明
bind()用来设置给参数sockfd的socket一个名称。此名称由参数my_addr指向一sockaddr结构,对于不一样的socket domain定义了一个通
用的数据结构
1 struct sockaddr 2 { 3 unsigned short int sa_family; 4 char sa_data[14]; 5 };
sa_family 为调用socket()时的domain参数,即AF_xxxx值。
sa_data 最多使用14个字符长度。
此sockaddr结构会因使用不一样的socket domain而有不一样结构定义,例如使用AF_INET domain,其socketaddr结构定义便为
复制代码
1 struct socketaddr_in 2 { 3 unsigned short int sin_family; 4 uint16_t sin_port; 5 struct in_addr sin_addr; 6 unsigned char sin_zero[8]; 7 }; 8 struct in_addr 9 { 10 uint32_t s_addr; 11 };
复制代码
sin_family 即为sa_family
sin_port 为使用的port编号
sin_addr.s_addr 为IP 地址
sin_zero 未使用。
参数
addrlen为sockaddr的结构长度。
返回值
成功则返回0,失败返回-1,错误缘由存于errno中。
错误代码
EBADF 参数sockfd 非合法socket处理代码。
EACCESS 权限不足
ENOTSOCK 参数sockfd为一文件描述词,非socket。
三、connect(创建socket连线)
头文件
1 #include 2 #include
定义函数
1 int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);
函数说明
connect()用来将参数sockfd 的socket 连至参数serv_addr 指定的网络地址。结构sockaddr请参考bind()。参数addrlen为sockaddr的结
构长度。
返回值
成功则返回0,失败返回-1,错误缘由存于errno中。
错误代码
EBADF 参数sockfd 非合法socket处理代码
EFAULT 参数serv_addr指针指向没法存取的内存空间
ENOTSOCK 参数sockfd为一文件描述词,非socket。
EISCONN 参数sockfd的socket已经是连线状态
ECONNREFUSED 连线要求被server端拒绝。
ETIMEDOUT 企图连线的操做超过限定时间仍未有响应。
ENETUNREACH 没法传送数据包至指定的主机。
EAFNOSUPPORT sockaddr结构的sa_family不正确。
EALREADY socket为不可阻断且先前的连线操做还未完成。
四、htonl(将32位主机字符顺序转换成网络字符顺序)
头文件
1 #includein.h>
定义函数
1 unsigned long int htonl(unsigned long int hostlong);
函数说明
htonl()用来将参数指定的32位hostlong 转换成网络字符顺序。
返回值
返回对应的网络字符顺序。
五、htons(将16位主机字符顺序转换成网络字符顺序)
头文件
1 #includein.h>
定义函数
1 unsigned short int htons(unsigned short int hostshort);
函数说明
htons()用来将参数指定的16位hostshort转换成网络字符顺序。
返回值
返回对应的网络字符顺序。
六、inet_addr(将网络地址转成二进制的数字)
头文件
1 #include 2 #includein.h> 3 #include
定义函数
1 unsigned long int inet_addr(const char *cp);
函数说明
inet_addr()用来将参数cp所指的网络地址字符串转换成网络所使用的二进制数字。网络地址字符串是以数字和点组成的字符串,例
如:“163.13.132.68”。
返回值
成功则返回对应的网络二进制的数字,失败返回-1。
七、inet_aton(将网络地址转成网络二进制的数字)
头文件
1 #include 2 #includein.h> 3 #include
定义函数
1 int inet_aton(const char * cp,struct in_addr *inp);
函数说明
inet_aton()用来将参数cp所指的网络地址字符串转换成网络使用的二进制的数字,而后存于参数inp所指的in_addr结构中。
结构in_addr定义以下
struct in_addr
{
unsigned long int s_addr;
};
返回值
成功则返回非0值,失败则返回0。
八、inet_ntoa(将网络二进制的数字转换成网络地址)
头文件
1 #include 2 #includein.h> 3 #include
定义函数
1 char * inet_ntoa(struct in_addr in);
函数说明
inet_ntoa()用来将参数in所指的网络二进制的数字转换成网络地址,而后将指向此网络地址字符串的指针返回。
返回值
成功则返回字符串指针,失败则返回NULL。
九、listen(等待链接)
头文件
1 #include
定义函数
1 int listen(int s,int backlog);
函数说明
listen()用来等待参数s 的socket连线。参数backlog指定同时能处理的最大链接要求,若是链接数目达此上限则client端将收到
ECONNREFUSED的错误。 Listen()并未开始接收连线,只是设置socket为listen模式,真正接收client端连线的是accept()。一般listen()
会在socket(),bind()以后调用,接着才调用accept()。
返回值
成功则返回0,失败返回-1,错误缘由存于errno
附加说明
listen()只适用SOCK_STREAM或SOCK_SEQPACKET的socket类型。若是socket为AF_INET则参数backlog 最大值可设至128。
错误代码
EBADF 参数sockfd非合法socket处理代码
EACCESS 权限不足
EOPNOTSUPP 指定的socket并未支援listen模式。
十、ntohl(将32位网络字符顺序转换成主机字符顺序)
头文件
1 #includein.h>
定义函数
1 unsigned long int ntohl(unsigned long int netlong);
函数说明
ntohl()用来将参数指定的32位netlong转换成主机字符顺序。
返回值
返回对应的主机字符顺序。
十一、ntohs(将16位网络字符顺序转换成主机字符顺序)
头文件
1 #includein.h>
定义函数
1 unsigned short int ntohs(unsigned short int netshort);
函数说明
ntohs()用来将参数指定的16位netshort转换成主机字符顺序。
返回值
返回对应的主机顺序。
十二、recv(经socket接收数据)
头文件
1 #include 2 #include
定义函数
1 int recv(int s,void *buf,int len,unsigned int flags);
函数说明
recv()用来接收远端主机经指定的socket传来的数据,并把数据存到由参数buf 指向的内存空间,参数len为可接收数据的最大长度。
参数
flags通常设0。其余数值定义以下:
MSG_OOB 接收以out-of-band 送出的数据。
MSG_PEEK 返回来的数据并不会在系统内删除,若是再调用recv()会返回相同的数据内容。
MSG_WAITALL强迫接收到len大小的数据后才能返回,除非有错误或信号产生。
MSG_NOSIGNAL此操做不肯被SIGPIPE信号中断返回值成功则返回接收到的字符数,失败返回-1,错误缘由存于errno中。
错误代码
EBADF 参数s非合法的socket处理代码
EFAULT 参数中有一指针指向没法存取的内存空间
ENOTSOCK 参数s为一文件描述词,非socket。
EINTR 被信号所中断
EAGAIN 此动做会令进程阻断,但参数s的socket为不可阻断
ENOBUFS 系统的缓冲内存不足。
ENOMEM 核心内存不足
EINVAL 传给系统调用的参数不正确。
1三、recvfrom(经socket接收数据)
相关函数
recv,recvmsg,send,sendto,socket
头文件
1 #include 2 #include
定义函数
1 int recvfrom(int s,void *buf,int len,unsigned int flags ,struct sockaddr *from ,int *fromlen);
函数说明
recv()用来接收远程主机经指定的socket 传来的数据,并把数据存到由参数buf 指向的内存空间,参数len 为可接收数据的最大长度。参
数flags 通常设0,其余数值定义请参考recv()。参数from用来指定欲传送的网络地址,结构sockaddr 请参考bind()。参数fromlen为
sockaddr的结构长度。
返回值
成功则返回接收到的字符数,失败则返回-1,错误缘由存于errno中。
错误代码
EBADF 参数s非合法的socket处理代码
EFAULT 参数中有一指针指向没法存取的内存空间。
ENOTSOCK 参数s为一文件描述词,非socket。
EINTR 被信号所中断。
EAGAIN 此动做会令进程阻断,但参数s的socket为不可阻断。
ENOBUFS 系统的缓冲内存不足
ENOMEM 核心内存不足
EINVAL 传给系统调用的参数不正确。
1四、recvmsg(经socket接收数据)
头文件
1 #include 2 #include
定义函数
1 int recvmsg(int s,struct msghdr *msg,unsigned int flags);
函数说明
recvmsg()用来接收远程主机经指定的socket传来的数据。参数s为已创建好连线的socket,若是利用UDP协议则不需通过连线操做。参
数 msg指向欲连线的数据结构内容,参数flags通常设0,详细描述请参考send()。关于结构msghdr的定义请参考sendmsg()。
返回值
成功则返回接收到的字符数,失败则返回-1,错误缘由存于errno中。
错误代码
EBADF 参数s非合法的socket处理代码。
EFAULT 参数中有一指针指向没法存取的内存空间
ENOTSOCK 参数s为一文件描述词,非socket。
EINTR 被信号所中断。
EAGAIN 此操做会令进程阻断,但参数s的socket为不可阻断。
ENOBUFS 系统的缓冲内存不足
ENOMEM 核心内存不足
EINVAL 传给系统调用的参数不正确。
1五、send(经socket传送数据)
头文件
1 #include 2 #include
定义函数
1 int send(int s,const void * msg,int len,unsigned int falgs);
函数说明
send()用来将数据由指定的socket 传给对方主机。参数s为已创建好链接的socket。参数msg指向欲连线的数据内容,参数len则为数据长
度。参数flags通常设0,其余数值定义以下
MSG_OOB 传送的数据以out-of-band 送出。
MSG_DONTROUTE 取消路由表查询
MSG_DONTWAIT 设置为不可阻断运做
MSG_NOSIGNAL 此动做不肯被SIGPIPE 信号中断。
返回值
成功则返回实际传送出去的字符数,失败返回-1。错误缘由存于errno
错误代码
EBADF 参数s 非合法的socket处理代码。
EFAULT 参数中有一指针指向没法存取的内存空间
ENOTSOCK 参数s为一文件描述词,非socket。
EINTR 被信号所中断。
EAGAIN 此操做会令进程阻断,但参数s的socket为不可阻断。
ENOBUFS 系统的缓冲内存不足
ENOMEM 核心内存不足
EINVAL 传给系统调用的参数不正确。
1六、sendmsg(经socket传送数据)
头文件
1 #include 2 #include
定义函数
1 int sendmsg(int s,const strcut msghdr *msg,unsigned int flags);
函数说明
sendmsg()用来将数据由指定的socket传给对方主机。参数s为已创建好连线的socket,若是利用UDP协议则不需通过连线操做。参数msg
指向欲连线的数据结构内容,参数flags通常默认为0,详细描述请参考send()。
结构msghdr定义以下
复制代码
1 struct msghdr 2 { 3 void *msg_name; /*Address to send to /receive from . */ 4 socklen_t msg_namelen; /* Length of addres data */ 5 strcut iovec * msg_iov; /* Vector of data to send/receive into */ 6 size_t msg_iovlen; /* Number of elements in the vector */ 7 void * msg_control; /* Ancillary dat */ 8 size_t msg_controllen; /* Ancillary data buffer length */ 9 int msg_flags; /* Flags on received message */ 10 };
复制代码
返回值
成功则返回实际传送出去的字符数,失败返回-1,错误缘由存于errno
错误代码
EBADF 参数s 非合法的socket处理代码。
EFAULT 参数中有一指针指向没法存取的内存空间
ENOTSOCK 参数s为一文件描述词,非socket。
EINTR 被信号所中断。
EAGAIN 此操做会令进程阻断,但参数s的socket为不可阻断。
ENOBUFS 系统的缓冲内存不足
ENOMEM 核心内存不足
EINVAL 传给系统调用的参数不正确。
1七、sendto(经socket传送数据)
头文件
1 #include < sys/types.h > 2 #include < sys/socket.h >
定义函数
1 int sendto ( int s , const void * msg, int len, unsigned int flags, const struct sockaddr * to , int tolen ) ;
函数说明
sendto() 用来将数据由指定的socket传给对方主机。参数s为已建好连线的socket,若是利用UDP协议则不需通过连线操做。参数msg指向
欲连线的数据内容,参数flags 通常设0,详细描述请参考send()。参数to用来指定欲传送的网络地址,结构sockaddr请参考bind()。参数
tolen为sockaddr的结果长度。
返回值
成功则返回实际传送出去的字符数,失败返回-1,错误缘由存于errno 中。
错误代码
EBADF 参数s非法的socket处理代码。
EFAULT 参数中有一指针指向没法存取的内存空间。
WNOTSOCK canshu s为一文件描述词,非socket。
EINTR 被信号所中断。
EAGAIN 此动做会令进程阻断,但参数s的soket为补课阻断的。
ENOBUFS 系统的缓冲内存不足。
EINVAL 传给系统调用的参数不正确。
1八、socket(创建一个socket通讯)
头文件
1 #include 2 #include
定义函数
1 int socket(int domain,int type,int protocol);
函数说明
socket()用来创建一个新的socket,也就是向系统注册,通知系统创建一通讯端口。参数domain 指定使用何种的地址类型,完整的定义
在/usr/include/bits/socket.h 内,底下是常见的协议:
PF_UNIX/PF_LOCAL/AF_UNIX/AF_LOCAL UNIX 进程通讯协议
PF_INET?AF_INET Ipv4网络协议
PF_INET6/AF_INET6 Ipv6 网络协议
PF_IPX/AF_IPX IPX-Novell协议
PF_NETLINK/AF_NETLINK 核心用户接口装置
PF_X25/AF_X25 ITU-T X.25/ISO-8208 协议
PF_AX25/AF_AX25 业余无线AX.25协议
PF_ATMPVC/AF_ATMPVC 存取原始ATM PVCs
PF_APPLETALK/AF_APPLETALK appletalk(DDP)协议
PF_PACKET/AF_PACKET 初级封包接口
参数
type有下列几种数值:
SOCK_STREAM 提供双向连续且可信赖的数据流,即TCP。支持
OOB 机制,在全部数据传送前必须使用connect()来创建连线状态。
SOCK_DGRAM 使用不连续不可信赖的数据包链接
SOCK_SEQPACKET 提供连续可信赖的数据包链接
SOCK_RAW 提供原始网络协议存取
SOCK_RDM 提供可信赖的数据包链接
SOCK_PACKET 提供和网络驱动程序直接通讯。
protocol用来指定socket所使用的传输协议编号,一般此参考不用管它,设为0便可。
返回值
成功则返回socket处理代码,失败返回-1。
错误代码
EPROTONOSUPPORT 参数domain指定的类型不支持参数type或protocol指定的协议
ENFILE 核心内存不足,没法创建新的socket结构
EMFILE 进程文件表溢出,没法再创建新的socket
EACCESS 权限不足,没法创建type或protocol指定的协议
ENOBUFS/ENOMEM 内存不足
EINVAL 参数domain/type/protocol不合法
(六)环境变量篇
一、getenv(取得环境变量内容)
头文件
1 #include
定义函数
1 char * getenv(const char *name);
函数说明
getenv()用来取得参数name环境变量的内容。参数name为环境变量的名称,若是该变量存在则会返回指向该内容的指针。环境变量的格
式为name=value。
返回值
执行成功则返回指向该内容的指针,找不到符合的环境变量名称则返回NULL。
二、putenv(改变或增长环境变量)
头文件
1 #include
定义函数
1 int putenv(const char * string);
函数说明
putenv()用来改变或增长环境变量的内容。参数string的格式为name=value,若是该环境变量原先存在,则变量内容会依参数string改
变,不然此参数内容会成为新的环境变量。
返回值
执行成功则返回0,有错误发生则返回-1。
错误代码
ENOMEM 内存不足,没法配置新的环境变量空间。
三、setenv(改变或增长环境变量)
头文件
1 #include
定义函数
1 int setenv(const char *name,const char * value,int overwrite);
函数说明
setenv()用来改变或增长环境变量的内容。参数name为环境变量名称字符串。
参数
value则为变量内容,参数overwrite用来决定是否要改变已存在的环境变量。若是overwrite不为0,而该环境变量原已有内容,则原内
容会被改成参数value所指的变量内容。若是overwrite为0,且该环境变量已有内容,则参数value会被忽略。
返回值
执行成功则返回0,有错误发生时返回-1。
错误代码
ENOMEM 内存不足,没法配置新的环境变量空间
(七)内存及字符串操做篇
一、bcmp(比较内存内容)
头文件
1 #include<string.h>
定义函数
1 int bcmp ( const void *s1,const void * s2,int n);
函数说明
bcmp()用来比较s1和s2所指的内存区间前n个字节,若参数n为0,则返回0。
返回值
若参数s1 和s2 所指的内存内容都彻底相同则返回0 值,不然返回非零值。
二、bcopy(拷贝内存内容)
头文件
1 #include <string.h>
定义函数
1 void bcopy ( const void *src,void *dest ,int n);
函数说明
bcopy()与memcpy()同样都是用来拷贝src所指的内存内容前n个字节到dest所指的地址,不过参数src与dest在传给函数时是相反的位置。
返回值
三、bzero(将一段内存内容全清为零)
头文件
1 #include<string.h>
定义函数
1 void bzero(void *s,int n);
函数说明
bzero()会将参数s所指的内存区域前n个字节,所有设为零值。至关于调用memset((void*)s,0,size_tn);
四、memccpy(拷贝内存内容)
头文件
1 #include<string.h>
定义函数
1 void * memccpy(void *dest, const void * src, int c,size_t n);
函数说明
memccpy()用来拷贝src所指的内存内容前n个字节到dest所指的地址上。与memcpy()不一样的是,memccpy()会在复制时检查参数c是否出
现,如果则返回dest中值为c的下一个字节地址。
返回值
返回指向dest中值为c的下一个字节指针。返回值为0表示在src所指内存前n个字节中没有值为c的字节。
五、memcmp(比较内存内容)
头文件
1 #include<string.h>
定义函数
1 int memcmp (const void *s1,const void *s2,size_t n);
函数说明
memcmp()用来比较s1和s2所指的内存区间前n个字符。字符串大小的比较是以ASCII码表上的顺序来决定,次顺序亦为字符的值。memcmp ()
首先将s1第一个字符值减去s2第一个字符的值,若差为0则再继续比较下个字符,若差值不为0则将差值返回。例如,字符串"Ac"和"ba"比
较则会返回字符'A'(65)和'b'(98)的差值(-33)。
返回值
若参数s1和s2所指的内存内容都彻底相同则返回0值。s1若大于s2则返回大于0的值。s1若小于s2则返回小于0的值。
六、memcpy(拷贝内存内容)
头文件
1 #include<string.h>
定义函数
1 void * memcpy (void * dest ,const void *src, size_t n);
函数说明
memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不一样的是,memcpy()会完整的复制n个字节,不会因
为遇到字符串结束'\0'而结束。
返回值
返回指向dest的指针。
附加说明
指针src和dest所指的内存区域不可重叠。
七、memset(将一段内存空间填入某值)
头文件
1 #include<string.h>
定义函数
1 void * memset (void *s ,int c, size_t n);
函数说明
memset()会将参数s所指的内存区域前n个字节以参数c填入,而后返回指向s的指针。在编写程序时,若须要将某一数组做初始化
memset()会至关方便。
返回值
返回指向s的指针。
附加说明
参数c虽声明为int, 但必须是unsigned char ,因此范围在0到255之间。
八、strlen(返回字符串长度)
头文件
1 #include<string.h>
定义函数
1 size_t strlen (const char *s);
函数说明
strlen()用来计算指定的字符串s的长度,不包括结束字符"\0"。
返回值
返回字符串s的字符数。
数组