(一)文件操作篇
1、creat(建立文件)
头文件
1 #include<sys/types.h> 2 #include<sys/stat.h> 3 #include<fcntl.h>
定义函数
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()。
2、open(打开文件)
头文件
1 #include<sys/types.h> 2 #include<sys/stat.h> 3 #include<fcntl.h>
定义函数
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 存取错误
3、close(关闭文件)
头文件
1 #include<unistd.h>
定义函数
1 int close(int fd);
函数说明
当使用完文件后若已不再需要则可使用close()关闭该文件,二close()会让数据写回磁盘,并释放该文件所占用的资源。参数fd为先前由open()或creat()所返回的文件描述词。
返回值
若文件顺利关闭则返回0,发生错误时返回-1。
错误代码
EBADF 参数fd 非有效的文件描述词或该文件已关闭。
附加说明
虽然在进程结束时,系统会自动关闭已打开的文件,但仍建议自行关闭文件,并确实检查返回值。
4、read(由已打开的文件读取数据)
头文件
1 #include<unistd.h>
定义函数
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 非有效的文件描述词,或该文件已关闭。
5、write(将数据写入已打开的文件内)
头文件
1 #include<unistd.h>
定义函数
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非有效的文件描述词,或该文件已关闭。
6、flock(锁定文件或解除锁定)
头文件
1 #include<sys/file.h>
定义函数
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。
7、lseek(移动文件的读写位置)
头文件
1 #include<sys/types.h> 2 #include<unistd.h>
定义函数
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。
8、fcntl(文件描述词操作)
头文件
1 #include<unistd.h> 2 #include<fcntl.h>
定义函数
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.
9、fgets(由文件中读取一字符串)
头文件
1 include<stdio.h>
定义函数
1 char * fgets(char * s,int size,FILE * stream);
函数说明
fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,直到出现换行字符、读到文件尾或是已读了size-1个字符为止,最后会加上NULL作为字符串结束。
返回值
gets()若成功则返回s指针,返回NULL则表示有错误发生。
10、fputs(将一指定的字符串写入文件内)
头文件
1 #include<stdio.h>
定义函数
1 int fputs(const char * s,FILE * stream);
函数说明
fputs()用来将参数s所指的字符串写入到参数stream所指的文件内。
返回值
若成功则返回写出的字符个数,返回EOF则表示有错误发生。
(二)内存控制篇
1、calloc(配置内存空间)
头文件
1 #include <stdlib.h>
定义函数
1 void *calloc(size_t nmemb,size_t size);
函数说明
calloc()用来配置nmemb个相邻的内存单位,每一单位的大小为size,并返回指向第一个元素的指针。这和使用下列的方式效果相同:malloc(nmemb*size);不过,在利用calloc()配置内存时会将内存内容初始化为0。
返回值
若配置成功则返回一指针,失败则返回NULL。
2、free(释放原先配置的内存)
头文件
1 #include<stdlib.h>
定义函数
1 void free(void *ptr);
函数说明
参数ptr为指向先前由malloc()、calloc()或realloc()所返回的内存指针。调用free()后ptr所指的内存空间便会被收回。假若参数ptr所指的内存空间已被收回或是未知的内存地址,则调用free()可能会有无法预期的情况发生。若参数ptr为NULL,则free()不会有任何作用。
3、malloc(配置内存空间)
头文件
1 #include<stdlib.h>
定义函数
1 void * malloc(size_t size);
函数说明
malloc()用来配置内存空间,其大小由指定的size决定。
返回值
若配置成功则返回一指针,失败则返回NULL。
范例
void p = malloc(1024); /*配置1k的内存*/
(三)进程操作篇
1、execl(执行文件)
头文件
1 #include<unistd.h>
定义函数
1 int execl(const char * path,const char * arg,....);
函数说明
execl()用来执行参数path字符串所代表的文件路径,接下来的参数代表执行该文件时传递过去的argv(0)、argv[1]……,最后一个参数必须用空指针(NULL)作结束。
返回值
如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。
2、execlp(从PATH 环境变量中查找文件并执行)
头文件
#include<unistd.h>
定义函数
1 int execlp(const char * file,const char * arg,……);
函数说明
execlp()会从PATH 环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个以后的参数当做该文件的argv[0]、argv[1]……,最后一个参数必须用空指针(NULL)作结束。
返回值
如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。
错误代码
参考execve()。
3、execv(执行文件)
头文件
1 #include<unistd.h>
定义函数
1 int execv (const char * path, char * const argv[ ]);
函数说明
execv()用来执行参数path字符串所代表的文件路径,与execl()不同的地方在于execve()只需两个参数,第二个参数利用数组指针来传递给执行文件。
返回值
如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。
错误代码
请参考execve()。
4、execve(执行文件)
头文件
1 #include<unistd.h>
定义函数
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翻译器有问题。
5、execvp(执行文件)
头文件
1 #include<unistd.h>
定义函数
1 int execvp(const char *file ,char * const argv []);
函数说明
execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件。
返回值
如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。
错误代码
请参考execve()。
6、exit(正常结束进程)
头文件
1 #include<stdlib.h>
定义函数
1 void exit(int status);
函数说明
exit()用来正常终结目前进程的执行,并把参数status返回给父进程,而进程所有的缓冲区数据会自动写回并关闭未关闭的文件。
7、_exit(结束进程执行)
头文件
1 #include<unistd.h>
定义函数
1 void _exit(int status);
函数说明
_exit()用来立刻结束目前进程的执行,并把参数status返回给父进程,并关闭未关闭的文件。此函数调用后不会返回,并且会传递SIGCHLD信号给父进程,父进程可以由wait函数取得子进程结束状态。
附加说明
_exit()不会处理标准I/O 缓冲区,如要更新缓冲区请使用exit()。
8、vfork(建立一个新的进程)
头文件
1 #include<unistd.h>
定义函数
1 pid_t vfork(void);
函数说明
vfork()会产生一个新的子进程,其子进程会复制父进程的数据与堆栈空间,并继承父进程的用户代码,组代码,环境变量、已打开的文件代码、工作目录和资源限制等。Linux 使用copy-on-write(COW)技术,只有当其中一进程试图修改欲复制的空间时才会做真正的复制动作,由于这些继承的信息是复制而来,并非指相同的内存空间,因此子进程对这些变量的修改和父进程并不会同步。此外,子进程不会继承父进程的文件锁定和未处理的信号。注意,Linux不保证子进程会比父进程先执行或晚执行,因此编写程序时要留意
死锁或竞争条件的发生。
返回值
如果vfork()成功则在父进程会返回新建立的子进程代码(PID),而在新建立的子进程中则返回0。如果vfork 失败则直接返回-1,失败原因存于errno中。
错误代码
EAGAIN 内存不足。ENOMEM 内存不足,无法配置核心所需的数据结构空间。
9、getpid(取得进程识别码)
头文件
1 #include<unistd.h>
定义函数
1 pid_t getpid(void);
函数说明
getpid()用来取得目前进程的进程识别码,许多程序利用取到的此值来建立临时文件,以避免临时文件相同带来的问题。
返回值
目前进程的进程识别码
10、getppid(取得父进程的进程识别码)
头文件
1 #include<unistd.h>
定义函数
1 pid_t getppid(void);
函数说明
getppid()用来取得目前进程的父进程识别码。
返回值
目前进程的父进程识别码。
11、wait(等待子进程中断或结束)
头文件
1 #include<sys/types.h> 2 #include<sys/wait.h>
定义函数
1 pid_t wait (int * status);
函数说明
wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status 返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则
参数
status可以设成NULL。子进程的结束状态值请参考waitpid()。
返回值
如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno中。
12、waitpid(等待子进程中断或结束)
头文件
1 #include<sys/types.h> 2 #include<sys/wait.h>
定义函数
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中。
(四)信号处理篇
1、sigaction(查询或设置信号处理方式)
头文件
1 #include<signal.h>
定义函数
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 此调用被中断
2、sigaddset(增加一个信号至信号集)
头文件
1 #include<signal.h>
定义函数
1 int sigaddset(sigset_t *set,int signum);
函数说明
sigaddset()用来将参数signum 代表的信号加入至参数set 信号集里。
返回值
执行成功则返回0,如果有错误则返回-1。
错误代码
EFAULT 参数set指针地址无法存取
EINVAL 参数signum非合法的信号编号
3、sigdelset(从信号集里删除一个信号)
头文件
1 #include<signal.h>
定义函数
1 int sigdelset(sigset_t * set,int signum);
函数说明
sigdelset()用来将参数signum代表的信号从参数set信号集里删除。
返回值
执行成功则返回0,如果有错误则返回-1。
错误代码
EFAULT 参数set指针地址无法存取
EINVAL 参数signum非合法的信号编号
4、sigemptyset(初始化信号集)
头文件
1 #include<signal.h>
定义函数
1 int sigemptyset(sigset_t *set);
函数说明
sigemptyset()用来将参数set信号集初始化并清空。
返回值
执行成功则返回0,如果有错误则返回-1。
错误代码
EFAULT 参数set指针地址无法存取
5、sigfillset(将所有信号加入至信号集)
头文件
1 #include<signal.h>
定义函数
1 int sigfillset(sigset_t * set);
函数说明
sigfillset()用来将参数set信号集初始化,然后把所有的信号加入到此信号集里。
返回值
执行成功则返回0,如果有错误则返回-1。
附加说明
EFAULT 参数set指针地址无法存取
6、sigismember(测试某个信号是否已加入至信号集里)
头文件
1 #include<signal.h>
定义函数
1 int sigismember(const sigset_t *set,int signum);
函数说明
sigismember()用来测试参数signum 代表的信号是否已加入至参数set信号集里。如果信号集里已有该信号则返回1,否则返回0。
返回值
信号集已有该信号则返回1,没有则返回0。如果有错误则返回-1。
错误代码
EFAULT 参数set指针地址无法存取
EINVAL 参数signum 非合法的信号编号
7、signal(设置信号处理方式)
头文件
1 #include<signal.h>
定义函数
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()。
8、sleep(让进程暂停执行一段时间)
头文件
1 #include<unistd.h>
定义函数
1 unsigned int sleep(unsigned int seconds);
函数说明
sleep()会令目前的进程暂停,直到达到参数seconds 所指定的时间,或是被信号所中断。
返回值
若进程暂停到参数seconds 所指定的时间则返回0,若有信号中断则返回剩余秒数。
9、perror(打印出错误原因信息字符串)
头文件
1 #include<stdio.h>
定义函数
1 void perror(const char *s);
函数说明
perror()用来将上一个函数发生错误的原因输出到标准错误(stderr)。参数s所指的字符串会先打印出,后面再加上错误原因字符串。此
错误原因依照全局变量errno的值来决定要输出的字符串。
返回值
10、mkfifo(建立具名管道)
头文件
1 #include<sys/types.h> 2 #include<sys/stat.h>
定义函数
1 int mkfifo(const char * pathname,mode_t mode);
函数说明
mkfifo()会依参数pathname建立特殊的FIFO文件,该文件必须不存在,而参数mode为该文件的权限(mode%~umask),因此 umask值也会
影响到FIFO文件的权限。Mkfifo()建立的FIFO文件其他进程都可以用读写一般文件的方式存取。当使用open()来打开 FIFO文件时,
O_NONBLOCK旗标会有影响
1、当使用O_NONBLOCK 旗标时,打开FIFO 文件来读取的操作会立刻返回,但是若还没有其他进程打开FIFO 文件来读取,则写入的操作会
返回ENXIO 错误代码。
2、没有使用O_NONBLOCK 旗标时,打开FIFO 来读取的操作会等到其他进程打开FIFO文件来写入才正常返回。同样地,打开FIFO文件来写
入的操作会等到其他进程打开FIFO 文件来读取后才正常返回。
返回值
若成功则返回0,否则返回-1,错误原因存于errno中。
错误代码
EACCESS 参数pathname所指定的目录路径无可执行的权限
EEXIST 参数pathname所指定的文件已存在。
ENAMETOOLONG 参数pathname的路径名称太长。
ENOENT 参数pathname包含的目录不存在
ENOSPC 文件系统的剩余空间不足
ENOTDIR 参数pathname路径中的目录存在但却非真正的目录。
EROFS 参数pathname指定的文件存在于只读文件系统内。
11、pclose(关闭管道I/O)
头文件
1 #include<stdio.h>
定义函数
1 int pclose(FILE * stream);
函数说明
pclose()用来关闭由popen所建立的管道及文件指针。参数stream为先前由popen()所返回的文件指针。
返回值
返回子进程的结束状态。如果有错误则返回-1,错误原因存于errno中。
错误代码
ECHILD pclose()无法取得子进程的结束状态。
12、pipe(建立管道)
头文件
1 #include<unistd.h>
定义函数
1 int pipe(int filedes[2]);
函数说明
pipe()会建立管道,并将文件描述词由参数filedes数组返回。filedes[0]为管道里的读取端,filedes[1]则为管道的写入端。
返回值
若成功则返回零,否则返回-1,错误原因存于errno中。
错误代码
EMFILE 进程已用完文件描述词最大量。
ENFILE 系统已无文件描述词可用。
EFAULT 参数filedes数组地址不合法。
13、popen(建立管道I/O)
头文件
1 #include<stdio.h>
定义函数
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()会继承环境变量,通过环境变量可能会造成系统安全的问题。
(五)接口处理篇
1、accept(接受socket连线)
头文件
1 #include<sys/types.h> 2 #include<sys/socket.h>
定义函数
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 核心内存不足。
2、bind(对socket定位)
头文件
1 #include<sys/types.h> 2 #include<sys/socket.h>
定义函数
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。
3、connect(建立socket连线)
头文件
1 #include<sys/types.h> 2 #include<sys/socket.h>
定义函数
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为不可阻断且先前的连线操作还未完成。
4、htonl(将32位主机字符顺序转换成网络字符顺序)
头文件
1 #include<netinet/in.h>
定义函数
1 unsigned long int htonl(unsigned long int hostlong);
函数说明
htonl()用来将参数指定的32位hostlong 转换成网络字符顺序。
返回值
返回对应的网络字符顺序。
5、htons(将16位主机字符顺序转换成网络字符顺序)
头文件
1 #include<netinet/in.h>
定义函数
1 unsigned short int htons(unsigned short int hostshort);
函数说明
htons()用来将参数指定的16位hostshort转换成网络字符顺序。
返回值
返回对应的网络字符顺序。
6、inet_addr(将网络地址转成二进制的数字)
头文件
1 #include<sys/socket.h> 2 #include<netinet/in.h> 3 #include<arpa/inet.h>
定义函数
1 unsigned long int inet_addr(const char *cp);
函数说明
inet_addr()用来将参数cp所指的网络地址字符串转换成网络所使用的二进制数字。网络地址字符串是以数字和点组成的字符串,例
如:“163.13.132.68”。
返回值
成功则返回对应的网络二进制的数字,失败返回-1。
7、inet_aton(将网络地址转成网络二进制的数字)
头文件
1 #include<sys/scoket.h> 2 #include<netinet/in.h> 3 #include<arpa/inet.h>
定义函数
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。
8、inet_ntoa(将网络二进制的数字转换成网络地址)
头文件
1 #include<sys/socket.h> 2 #include<netinet/in.h> 3 #include<arpa/inet.h>
定义函数
1 char * inet_ntoa(struct in_addr in);
函数说明
inet_ntoa()用来将参数in所指的网络二进制的数字转换成网络地址,然后将指向此网络地址字符串的指针返回。
返回值
成功则返回字符串指针,失败则返回NULL。
9、listen(等待连接)
头文件
1 #include<sys/socket.h>
定义函数
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模式。
10、ntohl(将32位网络字符顺序转换成主机字符顺序)
头文件
1 #include<netinet/in.h>
定义函数
1 unsigned long int ntohl(unsigned long int netlong);
函数说明
ntohl()用来将参数指定的32位netlong转换成主机字符顺序。
返回值
返回对应的主机字符顺序。
11、ntohs(将16位网络字符顺序转换成主机字符顺序)
头文件
1 #include<netinet/in.h>
定义函数
1 unsigned short int ntohs(unsigned short int netshort);
函数说明
ntohs()用来将参数指定的16位netshort转换成主机字符顺序。
返回值
返回对应的主机顺序。
12、recv(经socket接收数据)
头文件
1 #include<sys/types.h> 2 #include<sys/socket.h>
定义函数
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 传给系统调用的参数不正确。
13、recvfrom(经socket接收数据)
相关函数
recv,recvmsg,send,sendto,socket
头文件
1 #include<sys/types.h> 2 #include<sys/socket.h>
定义函数
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 传给系统调用的参数不正确。
14、recvmsg(经socket接收数据)
头文件
1 #include<sys/types.h> 2 #include<sys/socktet.h>
定义函数
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 传给系统调用的参数不正确。
15、send(经socket传送数据)
头文件
1 #include<sys/types.h> 2 #include<sys/socket.h>
定义函数
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 传给系统调用的参数不正确。
16、sendmsg(经socket传送数据)
头文件
1 #include<sys/types.h> 2 #include<sys/socket.h>
定义函数
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 传给系统调用的参数不正确。
17、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 传给系统调用的参数不正确。
18、socket(建立一个socket通信)
头文件
1 #include<sys/types.h> 2 #include<sys/socket.h>
定义函数
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不合法
(六)环境变量篇
1、getenv(取得环境变量内容)
头文件
1 #include<stdlib.h>
定义函数
1 char * getenv(const char *name);
函数说明
getenv()用来取得参数name环境变量的内容。参数name为环境变量的名称,如果该变量存在则会返回指向该内容的指针。环境变量的格
式为name=value。
返回值
执行成功则返回指向该内容的指针,找不到符合的环境变量名称则返回NULL。
2、putenv(改变或增加环境变量)
头文件
1 #include <stdlib.h>
定义函数
1 int putenv(const char * string);
函数说明
putenv()用来改变或增加环境变量的内容。参数string的格式为name=value,如果该环境变量原先存在,则变量内容会依参数string改
变,否则此参数内容会成为新的环境变量。
返回值
执行成功则返回0,有错误发生则返回-1。
错误代码
ENOMEM 内存不足,无法配置新的环境变量空间。
3、setenv(改变或增加环境变量)
头文件
1 #include<stdlib.h>
定义函数
1 int setenv(const char *name,const char * value,int overwrite);
函数说明
setenv()用来改变或增加环境变量的内容。参数name为环境变量名称字符串。
参数
value则为变量内容,参数overwrite用来决定是否要改变已存在的环境变量。如果overwrite不为0,而该环境变量原已有内容,则原内
容会被改为参数value所指的变量内容。如果overwrite为0,且该环境变量已有内容,则参数value会被忽略。
返回值
执行成功则返回0,有错误发生时返回-1。
错误代码
ENOMEM 内存不足,无法配置新的环境变量空间
(七)内存及字符串操作篇
1、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 值,否则返回非零值。
2、bcopy(拷贝内存内容)
头文件
1 #include <string.h>
定义函数
1 void bcopy ( const void *src,void *dest ,int n);
函数说明
bcopy()与memcpy()一样都是用来拷贝src所指的内存内容前n个字节到dest所指的地址,不过参数src与dest在传给函数时是相反的位置。
返回值
3、bzero(将一段内存内容全清为零)
头文件
1 #include<string.h>
定义函数
1 void bzero(void *s,int n);
函数说明
bzero()会将参数s所指的内存区域前n个字节,全部设为零值。相当于调用memset((void*)s,0,size_tn);
4、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的字节。
5、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的值。
6、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所指的内存区域不可重叠。
7、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之间。
8、strlen(返回字符串长度)
头文件
1 #include<string.h>
定义函数
1 size_t strlen (const char *s);
函数说明
strlen()用来计算指定的字符串s的长度,不包括结束字符"\0"。
返回值
返回字符串s的字符数。