linux C 函数

1、头文件

1.1、头文件的部分内容:

1.1.1、宏定义:

#define LC_ALL 0
#define LC_COLLATE 1
#define LC_CTYPE 2
#define LC_MONETARY 3
#define LC_NUMERIC 4
#define LC_TIME 5

#define LC_MIN LC_ALL
#define LC_MAX LC_TIME

1.1.2、声明类型:

#ifndef _LCONV_DEFINED
struct lconv {
char *decimal_point; //用来格式化非货币量的小数点字符。
char *thousands_sep; //用来对格式化的非货币量中小数点前面的数组进行分组的字符。
char *grouping; //一个字符串,它的元素说明了格式化的非货币量中每一组数字的数目。
char *int_curr_symbol; //适合当前区域设置的国际货币符号。前3个字符包含了符合ISO 4217:1987标准的字母国际货币符号。第四个字符(后面紧跟空字符)是国际货币符号与货币量之间的分隔符。
char *currency_symbol; //适用于当前区域设置的当地流通符号。
char *mon_decimal_point; //用来格式化货币量的小数点。
char *mon_thousands_sep; //对格式化的货币量中小数点前面的数字进行分组的分隔符。
char *mon_grouping; //一个字符串,它的元素说明了格式化的货币量分组中每组数字的数目。
char *positive_sign; //用来说明一个非负的格式化货币量的字符串。
char negative_sign; //用来说明一个负的格式化货币量的字符串。
char int_frac_digits; //在一个国际标准格式化货币量中显示的小数数字(小数点后面的数组)的数目。
char frac_digits; //在一个格式化货币量中显示的小数数字(小数点后面的数组)的数目。
char p_cs_precedes; //当currency_symbol放在一个非负的格式化货币量的值的前面或者后面时,分别设为1或者0.
char p_sep_by_space; //currency_symbol与非负的格式化货币量的值用空格分开时为1,否则为0。
char n_cs_precedes; //currency_symbol放在一个负的格式化货币量的前面或者后面时,分别设为1或者0。
char n_sep_by_space; //currency_symbol与负的格式化货币量用空格分开时为1,否则为0。
char p_sign_posn; //它的值用来说明一个非负的格式化货币量中的positive_sign的位置。
char n_sign_posn; //它的值用来说明一个负的格式化货币量中negative_sign的位置。
};
#define _LCONV_DEFINED
#endif /
_LCONV_DEFINED */

1.1.3、函数:

1.1.3.1、_CRTIMP char * __cdecl setlocale(int category, const char *locale);

函数setlocale根据参数category和locale选择适合程序的区域设置的各个类别。函数setlocale可能被用来修改和查询程序当前的整个区域设置或其中一部分。
当参数category是LC_ALL:对程序的整个区域设置进行命名。
当参数category是LC_COLLATE:影响函数strcoll和strxfrm的行为。
当参数category是LC_CTYPE:影响字符处理函数和多字节函数的行为。
当参数category是LC_MONETARY:影响函数localeconv函数返回的货币格式信息。
当参数category是LC_NUMERIC:影响格式化输入输出函数和字符转换函数的小数点字符以及函数localeconv函数返回的货币格式信息。
当参数category是LC_TIME:影响函数strftime的行为。
当参数locale是"C":为C翻译器指定了最小的环境值"",指定了实现定义的本地环境。在程序启动时,执行下面的代码或者和它等价的代码:setlocale(LC_ALL, “C”);实现的行为和没有库函数调用函数setlocale的情况相同。(没有搞明白!!!!!!)

返回值:

如果参数locale是一个指向传的指针且选择有效,则函数setlocale返回一个和新的区域设置指定的category相联系的串的指针。如果选择因故无法实现,则函数setlocale返回一个空指针且程序的区域设置不改变。
如果参数locale是一个空指针,则函数setlocale返回一个和程序当前区域设置的category相关的串的指针,程序的区域设置不改变。
函数setlocale返回的指向传的指针要满足对那个串值和它的相关的类别的后继调用会恢复程序区域设置的相应的部分。指向的串不能被程序修改,但可能会被函数setlocale的下一次调用覆盖。

1.1.3.2、_CRTIMP struct lconv * __cdecl localeconv(void);

函数localeconv会根据当前区域设置的规则,对一个struct lconv类型的对象的成员进行赋值,使其值适合格式化数字量(货币等)。
结构中char *类型的成员是指向字符串的指针,它们中的任何一个都(除了decimal_point)可以指向"",以说明该值在当前区域设置下不可用或者长度为零。char类型的成员是非负数组,任一成员都 可以是CHAR_MAX,以说明该值在当前区域设置下不可用。这些成员有:
char *decimal_point;:用来格式化非货币量的小数点字符。
char *thousands_sep;:用来对格式化的非货币量中小数点前面的数组进行分组的字符。
char *grouping;:一个字符串,它的元素说明了格式化的非货币量中每一组数字的数目。
char *int_curr_symbol;:适合当前区域设置的国际货币符号。前3个字符包含了符合ISO 4217:1987标准的字母国际货币符号。第四个字符(后面紧跟空字符)是国际货币符号与货币量之间的分隔符。
char *currency_symbol;:适用于当前区域设置的当地流通符号。
char *mon_decimal_point;:用来格式化货币量的小数点。
char *mon_thousands_sep;:对格式化的货币量中小数点前面的数字进行分组的分隔符。
char *mon_grouping;:一个字符串,它的元素说明了格式化的货币量分组中每组数字的数目。
char *positive_sign;:用来说明一个非负的格式化货币量的字符串。
char *negative_sign;:用来说明一个负的格式化货币量的字符串。
char int_frac_digits;:在一个国际标准格式化货币量中显示的小数数字(小数点后面的数组)的数目。
char frac_digits;:在一个格式化货币量中显示的小数数字(小数点后面的数组)的数目。
char p_cs_precedes;:当currency_symbol放在一个非负的格式化货币量的值的前面或者后面时,分别设为1或者0.
char p_sep_by_space;:currency_symbol与非负的格式化货币量的值用空格分开时为1,否则为0。
char n_cs_precedes;:currency_symbol放在一个负的格式化货币量的前面或者后面时,分别设为1或者0。
char n_sep_by_space;:currency_symbol与负的格式化货币量用空格分开时为1,否则为0。
char p_sign_posn;:它的值用来说明一个非负的格式化货币量中的positive_sign的位置。
char n_sign_posn;:它的值用来说明一个负的格式化货币量中negative_sign的位置。

grouping和mon_grouping的元素的解释如下:
CHAR_MAX不能近一步分组:
0 剩余的数字重复使用前一个元素;
其他值 整数值是组成当前组的数字的数目。检查下一个元素来确定当前分组前面的下一组数字的数目。

p_sign_posn和n_sign_posn的值解释如下:
0 数字与currency_symbol放在括号中;
1 符号字符串放在数字与currency_symbol前面;
2 符号字符串放在数字与currency_symbol后面;
3 符号字符串紧挨着放在currency_symbol前面;
4 符号字符串紧挨着放在currency_symbol后面;

实现的行为应假设没有库函数调用localeconv。

返回值:

函数localeconv返回一个指向已填充对象的指针。返回值指向的结构不能被程序修改,但是可能会被localeconv的下一次调用覆盖。另外,用类别LC_ALL、LC_MONETARY或者LC_NUMERIC调用函数setlocale可能会覆盖结构的内容。
linux C 函数_第1张图片

头文件#include

函数:dup、dup2、dup3

   int dup(int oldfd);
   int dup2(int oldfd, int newfd);

   #define _GNU_SOURCE             /* See feature_test_macros(7) */
   #include               /* Obtain O_* constant definitions */
   #include 

   int dup3(int oldfd, int newfd, int flags);

函数说明:

1、int dup(int oldfd);

dup() uses the lowest-numbered unused descriptor for the new descriptor.(from man)
dup用来复制参数oldfd所指的文件描述符。当复制成功是,返回最小的尚未被使用过的文件描述符,若有错误则返回-1.错误代码存入errno中返回的新文件描述符和参数oldfd指向同一个文件,这两个描述符共享同一个数据结构,共享所有的锁定,读写指针和各项全现或标志位。调用dup(oldfd)等效于 fcntl(oldfd, F_DUPFD, 0)

例子:

pfd = dup(STDERR_FILENO); //pfd指向STDERR_FILENO标准错误文件

2、int dup2(int oldfd, int newfd);

dup2() makes newfd be the copy of oldfd, closing newfd first if necessary, but note the following:

   *  If oldfd is not a valid file descriptor, then the call fails, and newfd is not closed.

   *  If oldfd is a valid file descriptor, and newfd has the same value as oldfd, then dup2() does nothing, and returns newfd.(from man)

dup2与dup区别是dup2可以用参数newfd指定新文件描述符的数值。若参数newfd已经被程序使用,则系统就会将newfd所指的文件关闭,若newfd等于oldfd,则返回newfd,而不关闭newfd所指的文件。dup2所复制的文件描述符与原来的文件描述符共享各种文件状态。共享所有的锁定,读写位置和各项权限或flags等.返回值:若dup2调用成功则返回新的文件描述符,出错则返回-1.

例子:

dup2(fileno(log_file), STDOUT_FILENO); //将标准输出重定向到文件log_file,即向标准输出写数据就写到了log_file文件
dup2(fileno(log_file), STDERR_FILENO); //将标准错误重定向到文件log_file,即向标准输出写数据就写到了log_file文件

要点:

1、STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO 定义在 中,值分别是 0,1,2.代表标准输入、标准输出、标准错误。

2、返回值及错误代码
RETURN VALUE

   On success, these system calls return the new descriptor.  On error, -1 is returned, and errno is set appropriately.

ERRORS

   EBADF  oldfd isn't an open file descriptor, or newfd is out of the allowed range for file descriptors.

   EBUSY  (Linux only) This may be returned by dup2() or dup3() during a race condition with open(2) and dup().

   EINTR  The dup2() or dup3() call was interrupted by a signal; see signal(7).

   EINVAL (dup3()) flags contain an invalid value.  Or, oldfd was equal to newfd.

   EMFILE The process already has the maximum number of file descriptors open and tried to open a new one.

函数:fcntl

#include
#include

   int fcntl(int fd, int cmd, ... /* arg */ );

详细的:
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd ,struct flock* lock);
DESCRIPTION:函数描述

   fcntl() performs one of the operations described below on the open file descriptor fd.  The operation is determined by cmd.

   fcntl()  can  take an optional third argument.  Whether or not this argument is required is determined by cmd.  The required argu‐
   ment type is indicated in parentheses after each cmd name (in most cases, the required type is int, and we identify  the  argument
   using the name arg), or void is specified if the argument is not required.(from man)
   fcntl()针对(文件)描述符提供控制。参数fd是被参数cmd操作(如下面的描述)的描述符。针对cmd的值,fcntl能够接受第三个参数int arg。

linux C 函数_第2张图片
(1)F_DUPFD
与dup函数功能一样,复制由fd指向的文件描述符,调用成功后返回新的文件描述符,与旧的文件描述符共同指向同一个文件。
(2)F_GETFD
读取文件描述符close-on-exec标志
(3)F_SETFD
将文件描述符close-on-exec标志设置为第三个参数arg的最后一位
(4)F_GETFL
获取文件打开方式的标志,标志值含义与open调用一致
(5)F_SETF
设置文件打开方式为arg指定方式

文件记录锁是fcntl函数的主要功能。
记录锁:实现只锁文件的某个部分,并且可以灵活的选择是阻塞方式还是立刻返回方式
当fcntl用于管理文件记录锁的操作时,第三个参数指向一个struct flock *lock的结构体

struct flock
{
    short_l_type;    /*锁的类型*/
    short_l_whence;  /*偏移量的起始位置:SEEK_SET,SEEK_CUR,SEEK_END*/
    off_t_l_start;     /*加锁的起始偏移*/
    off_t_l_len;    /*上锁字节*/
    pid_t_l_pid;   /*锁的属主进程ID */
}; 

short_l_type用来指定设置共享锁(F_RDLCK,读锁)还是互斥锁(F_WDLCK,写锁).
当short_l_type的值为F_UNLCK时,传入函数中将解锁。
每个进程可以在该字节区域上设置不同的读锁。
但给定的字节上只能设置一把写锁,并且写锁存在就不能再设其他任何锁,且该写锁只能被一个进程单独使用。
这是多个进程的情况。
单个进程时,文件的一个区域上只能有一把锁,若该区域已经存在一个锁,再在该区域设置锁时,新锁会覆盖掉旧的锁,无论是
写锁还时读锁。
l_whence,l_start,l_len三个变量来确定给文件上锁的区域。
l_whence确定文件内部的位置指针从哪开始,l_star确定从l_whence开始的位置的偏移量,两个变量一起确定了文件内的位置指
针先所指的位置,即开始上锁的位置,然后l_len的字节数就确定了上锁的区域。
特殊的,当l_len的值为0时,则表示锁的区域从起点开始直至最大的可能位置,就是从l_whence和l_start两个变量确定的开始位
置开始上锁,将开始以后的所有区域都上锁。为了锁整个文件,我们会把l_whence,l_start,l_len都设为0。

(6)F_SETLK
此时fcntl函数用来设置或释放锁。当short_l_type为F_RDLCK为读锁,F_WDLCK为写锁,F_UNLCK为解锁。
如果锁被其他进程占用,则返回-1;这种情况设的锁遇到锁被其他进程占用时,会立刻停止进程。

(7)F_SETLKW
此时也是给文件上锁,不同于F_SETLK的是,该上锁是阻塞方式。当希望设置的锁因为其他锁而被阻止设置时,该命令会等待相冲突的锁被释放。

(8)F_GETLK
第3个参数lock指向一个希望设置的锁的属性结构,如果锁能被设置,该命令并不真的设置锁,而是只修改lock的l_type为
F_UNLCK,然后返回该结构体。如果存在一个或多个锁与希望设置的锁相互冲突,则fcntl返回其中的一个锁的flock结构。

你可能感兴趣的:(linux C 函数)