webserver中所用到的函数

1.查看父串中是否存在字串

函数原型:

    #include <string.h>

    char *strstr(const char *haystack, const char *needle);

    由haystack所指向的字符串中,查看是否存在由neddle所指向的子串

函数参数:

    haystack:父串指针

    needle:字串指针

函数返回值:

    char * :若子串存在于父串之中,则返回子串在父串中的起始指针

    NULL : 父串中不存在子串





2.将格式化内容写(输出)到指定的字符串中

    函数原型:

    #include <stdio.h>

    int sprintf(char *str, const char *format, ...)

    函数参数:

    str :将要被写入的字符串指针

    format :将要写入的字符串。例如:"123";

    ...   :由format参数决定。例如:sprintf(str,"123");   sprintf(str,  "%s123",  "abc");

    函数返回值:

    成功:写入的字符串长度,不包括'\0'。但是'\0'存在字符串的末尾。

    失败:返回一个负数,代表没有写入成功

    注意事项:

    要确保str指向的字符从足够长,能够容纳将要写入的字符串

    sprintf(str, "%s”"123",  str); 第二个参数中可以连续出现""“”表示两个字符串。这个函数也可以实现字符串拼接的功能。




3.打开,遍历,关闭目录

    #include <sys/types.h>
    #include <dirent.h>    

    打开目录:    

函数原型:    

    DIR *opendir(const char *name)

参数:

    name :指向要打开的目录名。如果为空,函数返回空

返回值:

    DIR *:成功打开目录,返回一个指向目录流的指针(目录流?)

    NULL : 发生错误,返回NULL,且errno会被设置

注意事项:

    可以简单的理解为:该函数成功返回表示成功打开了一个目录



遍历目录:

函数原型:

    #include <dirent.h>
    struct dirent *readdir(DIR *dirp);

函数参数:

        dirp : opendir()的返回值,用来遍历dirp目录下的文件和目录

返回值:

    struct dirent * :成功,返回一个指向结构体的指针,该结构体包含了目录或者文件的相关信息(名称,类型等)

    NULL:遍历到最后一项,或者发生了错误。

注意事项:

    该函数通常和while()语句一起使用:while(  (dir=readdir ( dirp) ) )


关闭一个目录:

#include <sys/types.h>

 #include <dirent.h>

函数原型:

int closedir(DIR *dirp);

参数:

    dirp:opendir()的返回值,指定要关闭的目录。

返回值:

    0:关闭目录成功

    -1:出错,errno被设置



4.查看一个文件的相关信息(文件类型等信息)

函数原型:

       #include <sys/types.h>
       #include <sys/stat.h>
       #include <unistd.h>
       int stat(const char *pathname, struct stat *statbuf);

函数参数:

    pathname:  指向要查看的文件名

    statbuf :结构体指针类型,该结构体用来存放相关的文件信息

返回值:

    成功:0被返回

    失败:-1被返回

注意事项:

    使用该函数时,需要自己先定义一个结构体遍历:struct  stat  buf;

    使用该函数时,不用打开文件。

    struct  stat 的部分内容{

                mode_t    st_mode;//记录了文件类型和权限

                uid_t     st_uid;//该文件所有者的用户id

    }

    可以使用以下宏判断文件的类型:

    S_ISLNK (st_mode)    判断是否为符号连接
    S_ISREG (st_mode)    是否为一般文件
    S_ISDIR (st_mode)    是否为目录
    S_ISCHR (st_mode)    是否为字符装置文件
    S_ISBLK (s3e)        是否为先进先出
    S_ISSOCK (st_mode)   是否为socket

    

5.查看用户的相关信息

函数原型:

    #include <sys/types.h>

    #include <pwd.h>

    struct passwd *getpwuid(uid_t uid);

函数参数:

uid  : 用户uid , 可以通过stat()函数获得

函数返回值:

    struct passwd *  :成功,返回一个指向用户信息(结构体)的指针

    NULL: 发生错误,errno被设置

注意事项:

该函数使用时不用自己定义一个结构体变量,只需要定义一个指针用来接收getpwuid()函数的返回值。




6.打开文件

函数原型:

#include <sys/types.h>
#include <sys/stat.h>

#include <fcntl.h>

int open(const char *pathname, int flags);

int open(const char *pathname, int flags, mode_t mode);


函数参数:

pathname :指向了文件名

flags : 指定打开文件的方式

mode :指定文件的权限

函数返回值:

    file descriptor : 成功,返回一个文件描述符

    -1 :发生了错误

注意事项:

    要指定第三个参数,需要在第二个参数中指定O_CREAT or O_TMPFILE,否则第三个参数会被忽略

    必须包含以下一个flags:  O_RDONLY, O_WRONLY, or O_RDWR

    第一次被打开的文件,其文件描述符是:3



7.将文件映射到进程虚拟地址空间

函数原型

#include <sys/mman.h>

void *mmap(void *addr, size_t length,  int prot,   int flags, int fd,  off_t offset);

函数参数

addr :映射到虚拟地址空间的起始地址,通常指定为NULL.

length : 文件的大小,以字节为单位,不足一页的会按一页计算

prot :期望的内存保护方式,不能和文件的打开方式冲突,以下选择之间可以或运算

        

PROT_EXEC //页内容可以被执行
PROT_READ //页内容可以被读取
PROT_WRITE //页可以被写入
PROT_NONE //页不可访问

flags :

    MAP_PRIVATE:对内存的修改,不反映到其他进程和文件

    MAP_ANONYMOUS:对内存的修改,不反映到文件

    MAP_SHARED:对内存的修改,反映到其他进程和文件,提供了进程中共享内存的方法

fd:  有效的文件描述词。一般是由open()函数返回,其值也可以设置为-1,此时需要指定flags参数中的MAP_ANON,表明进行的是匿名映射。

offset  :一般设为0,表示从文件头开始映射

函数返回值:

void * :成功,被映射的虚拟地址空间的起始地址

MAP_FAILED (that is, (void *) -1) :失败,errno也会被设置。

注意事项:

详细的mmap()信息,可以参见:https://blog.csdn.net/u013525455/article/details/52582839 中系统调用部分。



8.解除文件和虚拟地址空间的映射

函数原型:

    #include <sys/mman.h>

    int munmap(void *addr, size_t length);

函数参数:

addr :mmap()的返回值

length :可以使用mmap()中的length值

函数返回值:

0:成功

-1:errno被设置

注意事项:

一般说来,进程在映射空间的对共享内容的改变并不直接写回到磁盘文件中,往往在调用munmap()后才执行该操作。可以通过调用msync()实现磁盘上文件内容与共享内存区的内容一致。



9. 关闭一个文件

函数原型:

    #include <unistd.h>
    int close(int fd);

函数参数:

    fd : 表示要关闭的文件描述符

函数返回值:

0 :成功

-1:失败,errno被设置



10.改变或增加环境变量列表的值。

函数原型:

    int setenv(const char *name, const char *value, int overwrite)

函数参数:

    name:指向环境变量名

    value:指向环境变量值

    overwrite:如果该环境变量原已有值:如果overwrite不为0,而该环境变量原已有内容,则原内容会被改为参数value所指的变量内容。如果overwrite为0,且该环境变量已有内容,则参数value会被忽略。

函数返回值:

    0:成功

    -1:出错




11.从环境列表中获得一个环境变量

函数原型:

    char *getenv(const char *name)

函数参数:

    name:指向环境变量名

函数返回值:

char * :指向名为name的环境变量

NULL: 名为name的环境变量不存在



12.重定位文件描述符

函数原型:

    #include <unistd.h>

    int dup2(int fildes, int fildes2)

函数参数:

    fides:源文件描述符

    fildes2:目标文件描述符

    函数成功返回时,右边的文件描述符会变成左边的一个副本,也就是说这两个文件描述父都代表了左边文件描述符

    对应的文件。

函数返回值:

    成功:返回一个新的文件描述符

    失败:-1





    
















猜你喜欢

转载自blog.csdn.net/qq_39846745/article/details/80894715