Java并发编程学习18-线程池的使用(递归算法的并行化改进)
引言
上篇介绍了 ThreadPoolExecutor
配置和扩展相关的信息,本篇开始将介绍递归算法的并行化。
还记得我们在《Java并发编程学习11-任务执行演示》中,对页面绘制程序进行一系列改进,这些改进大大地提供了页面绘制的并行性。
上篇介绍了 ThreadPoolExecutor
配置和扩展相关的信息,本篇开始将介绍递归算法的并行化。
还记得我们在《Java并发编程学习11-任务执行演示》中,对页面绘制程序进行一系列改进,这些改进大大地提供了页面绘制的并行性。
函数声明 | 函数功能 |
---|---|
double tan(double x) |
计算 以弧度 x 为单位的角度的正切值(double) |
float tanf(float x) |
计算 以弧度 x 为单位的角度的正切值(float) |
long double tanl(long double x) |
计算 以弧度 x 为单位的角度的正切值(long double) |
double tanh(double x); |
计算 x 的双曲正切值(double) |
float tanhf(float x); |
计算 x 的双曲正切值(float) |
long double tanhl(long double x); |
计算 x 的双曲正切值(long double) |
off_t tell(int fd); |
用于返回文件指针当前位置相对于文件开头的偏移量 |
long int telldir(DIR *dirp); |
获取目录流的当前位置 |
int textheight(char *string); |
用于获取当前文本模式下字符的高度 |
int textwidth(char *string); |
用于获取当前文本模式下字符的宽度 |
time_t time(time_t *timer); |
可以用于获取从 1970 年 1 月 1 日 00:00:00 UTC 到当前时间的秒数 |
FILE *tmpfile(void); |
可以用于在临时目录中创建一个唯一的临时文件,并返回文件指针 |
char *tmpnam(char *s); |
用于创建一个唯一的临时文件名 |
int toascii(int c); |
将一个字符转换为其对应的 ASCII 码值 |
int tolower(int c); |
可以用于将一个 ASCII 字符转换为小写字母 |
int toupper(int c); |
可以用于将一个 ASCII 字符转换为大写字母 |
double trunc(double x); |
截取 x 的小数部分,并返回整数部分(double) |
float truncf(float x); |
截取 x 的小数部分,并返回整数部分(float) |
long double truncl(long double x); |
截取 x 的小数部分,并返回整数部分(long double) |
void tzset(void); |
可以用于设置时区信息 |
double tgamma(double x); |
用于计算 Gamma 函数(double) |
float tgammaf(float x); |
用于计算 Gamma 函数(float) |
long double tgammal(long double x); |
用于计算 Gamma 函数(long double) |
函数声明 | 函数功能 |
---|---|
double tan(double x) |
计算 以弧度 x 为单位的角度的正切值(double) |
float tanf(float x) |
计算 以弧度 x 为单位的角度的正切值(float) |
long double tanl(long double x) |
计算 以弧度 x 为单位的角度的正切值(long double) |
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
double tanh(double x); |
计算 x 的双曲正切值(double) |
float tanhf(float x); |
计算 x 的双曲正切值(float) |
long double tanhl(long double x); |
计算 x 的双曲正切值(long double) |
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
off_t tell(int fd); |
用于返回文件指针当前位置相对于文件开头的偏移量 |
参数:
1 | #include <stdio.h> |
在上面这个示例中,
tell()
函数获取了当前的文件偏移量。read()
函数读取了一些数据,并再次使用 tell()
函数来获取新的文件偏移量。close()
函数关闭文件。注意:tell()
函数和 lseek
函数的功能类似,但有一个重要的区别:tell()
函数只用于查询当前位置,而不能修改文件指针的位置。如果要修改文件指针的位置,请使用 lseek()
函数。
下面我们来看看,使用 lseek()
函数来演示上面的 tell()
函数的示例 :
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
long int telldir(DIR *dirp); |
获取目录流的当前位置 |
参数:
DIR
类型结构体的指针1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
int textheight(char *string); |
用于获取当前文本模式下字符的高度 |
int textwidth(char *string); |
用于获取当前文本模式下字符的宽度 |
参数:
1 | #include <graphics.h> |
函数声明 | 函数功能 |
---|---|
time_t time(time_t *timer); |
可以用于获取从 1970 年 1 月 1 日 00:00:00 UTC 到当前时间的秒数 |
参数:
time_t
类型对象的指针,如果不想使用此参数,可以将它设置为 NULL
1 | #include <stdio.h> |
在上面的示例中,
time()
函数来获取当前时间的秒数;ctime()
函数将其转换为可读的日期和时间格式;函数声明 | 函数功能 |
---|---|
FILE *tmpfile(void); |
可以用于在临时目录中创建一个唯一的临时文件,并返回文件指针 |
1 | #include <stdio.h> |
在上述的示例中,
tmpfile()
函数创建一个临时文件;fputs()
函数将字符串 "这是一个临时文件"
写入该文件;rewind()
函数将文件指针移动到文件开始处;fgets()
函数从临时文件中读取数据并将其存储到字符串数组 str
中;注意: 使用 tmpfile()
创建的临时文件只在程序运行期间存在,并在程序终止时自动删除。如果需要在程序运行期间保留临时文件,请使用 tmpnam()
或 mkstemp()
等函数来创建文件。
函数声明 | 函数功能 |
---|---|
char *tmpnam(char *s); |
用于创建一个唯一的临时文件名 |
参数:
s
等于 NULL
,则函数会返回指向静态内存区的指针,该内存区包含了唯一的临时文件名1 | #include <stdio.h> |
在上面的示例中,
tmpnam()
函数创建一个唯一的临时文件名;tmpname
中;注意: 使用 tmpnam()
创建的临时文件名只在程序运行期间存在,不具有真正唯一性,因此可能存在一定程度的风险。如果需要创建一个具有真正唯一性的临时文件,请考虑使用 mkstemp()
或类似的函数。
函数声明 | 函数功能 |
---|---|
int toascii(int c); |
将一个字符转换为其对应的 ASCII 码值 |
参数:
1 | #include <stdio.h> |
注意 : toascii()
函数已经过时,不建议在新代码中使用。在 C99
标准中,改用更安全的 isascii()
函数来检查字符是否为 7-bit ASCII
字符,并使用位掩码操作或其他算法来将非 ASCII
字符转换为相应的 7-bit ASCII
码值。
知识点: 7-bit ASCII
,也称为美国信息交换标准代码 (American Standard Code for Information Interchange
),是一种基于英语的字符编码系统,使用 7
个二进制位(即一个字节)表示每个字符。它涵盖了拉丁字母、数字、标点符号和一些特殊符号,共计 128
个字符。
函数声明 | 函数功能 |
---|---|
int tolower(int c); |
可以用于将一个 ASCII 字符转换为小写字母 |
参数:
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
int toupper(int c); |
可以用于将一个 ASCII 字符转换为大写字母 |
参数:
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
double trunc(double x); |
截取 x 的小数部分,并返回整数部分(double) |
float truncf(float x); |
截取 x 的小数部分,并返回整数部分(float) |
long double truncl(long double x); |
截取 x 的小数部分,并返回整数部分(long double) |
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
void tzset(void); |
可以用于设置时区信息 |
UNIX/Linux 下示例:
1 | #include <stdio.h> |
windows 下示例:
1 | #include <stdio.h> |
在上述示例代码中,
rawtime
和 timeinfo
,分别用于存储当前时间和时间结构体。GetTimeZoneInformation()
函数获取当前系统时区信息,并将其存储在 tzinfo
变量中。WideCharToMultiByte()
函数将 tzinfo.StandardName
转换为 UTF-8
编码的字符串,并将其存储在 standard_name
变量中。putenv_s()
函数将 standard_name
设置为环境变量 TZ
的值,并使用 tzset 函数更新本地时区信息。localtime()
函数将 rawtime
转换为时间结构体 timeinfo
。asctime()
函数将时间结构体 timeinfo
转换为字符串格式,并输出到标准输出流中。standard_name
分配的内存空间,并正常结束程序。函数声明 | 函数功能 |
---|---|
double tgamma(double x); |
用于计算 Gamma 函数(double) |
float tgammaf(float x); |
用于计算 Gamma 函数(float) |
long double tgammal(long double x); |
用于计算 Gamma 函数(long double) |
1 | #include <stdio.h> |
知识点: 伽玛函数(Gamma
函数),也叫欧拉第二积分,是阶乘函数在实数与复数上扩展的一类函数。
函数声明 | 函数功能 |
---|---|
char * strdup(const char *s); |
用于将一个以 NULL 结尾的字符串复制到新分配的内存空间中 |
int stricmp(const char *s1, const char *s2); |
用于比较两个字符串的字母序是否相等,忽略大小写 |
char *strerror(int errnum); |
用于将指定的错误码转换为相应的错误信息 |
int strcmpi(const char *s1, const char *s2); |
用于比较两个字符串的字母序是否相等,忽略大小写 |
int strncmp(const char *s1, const char *s2, size_t n); |
用于比较两个字符串的前n个字符是否相等 |
int strncmpi(const char *s1, const char *s2, size_t n); |
用于比较两个字符串的前n个字符是否相等,忽略大小写 |
char *strncpy(char *dest, const char *src, size_t n); |
用于将一个字符串的一部分拷贝到另一个字符串中 |
int strnicmp(const char *s1, const char *s2, size_t n); |
用于比较两个字符串的前n个字符是否相等,忽略大小写 |
char *strnset(char *str, int c, size_t n); |
用于将一个字符串的前n个字符都设置为指定的字符 |
char *strpbrk(const char *str1, const char *str2); |
用于在一个字符串中查找任意给定字符集合中的字符的第一次出现位置 |
char *strrchr(const char *str, int character); |
在给定的字符串中查找指定字符的最后一个匹配项 |
char *strrev(char *str); |
将给定字符串中的所有字符顺序颠倒,并返回颠倒后的字符串 |
char *strset(char *str, int character); |
用于设置给定字符串中的所有字符为指定的值,并返回修改后的字符串 |
size_t strspn(const char *str1, const char *str2); |
计算字符串 str1 中包含在字符串 str2 中的前缀子字符串长度,并返回该长度值 |
char *strstr(const char *str1, const char *str2); |
在字符串 str1 中查找第一个出现的字符串 str2,如果找到了,则返回指向该位置的指针;否则,返回 NULL |
double strtod(const char *str, char **endptr); |
将字符串 str 转换为一个浮点数(double 类型),并返回该浮点数。如果发生了转换错误,则返回 0.0,并且可以通过 endptr 指针返回指向第一个无法转换的字符的指针。 |
char *strtok(char *str, const char *delim); |
用于将一个字符串分割成多个子字符串 |
long int strtol(const char *str, char **endptr, int base); |
将字符串 str 转换为一个长整型数(long int 类型) |
char *strupr(char *str); |
将字符串 str 中的所有小写字母转换为大写字母,并返回指向该字符串的指针 |
void swab(const void *src, void *dest, ssize_t nbytes); |
将源缓冲区中的每两个相邻字节进行互换,然后将结果存储到目标缓冲区中 |
int system(const char *command); |
执行一个 shell 或 cmd 命令,并等待命令的完成 |
函数声明 | 函数功能 |
---|---|
char * strdup(const char *s); |
用于将一个以 NULL 结尾的字符串复制到新分配的内存空间中 |
注意: strdup()
函数返回指向新分配的内存空间的指针,如果空间不足则返回 NULL
。调用者负责释放返回的指针所指向的内存空间。 strdup()
函数与strcpy()
函数类似,但是它会动态地分配内存空间,而 strcpy()
需要调用者提供足够大的目标缓冲区。
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
int stricmp(const char *s1, const char *s2); |
用于比较两个字符串的字母序是否相等,忽略大小写 |
返回值:
s1
和 s2
代表的字符串相等(忽略大小写),则返回 0
;s1
比 s2
小,则返回负数;s1
比 s2
大,则返回正数。1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
char *strerror(int errnum); |
用于将指定的错误码转换为相应的错误信息 |
参数:
返回值:
指向错误信息字符串的指针,该字符串描述了与错误码相关的错误
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
int strcmpi(const char *s1, const char *s2); |
用于比较两个字符串的字母序是否相等,忽略大小写 |
返回值:
s1
和 s2
代表的字符串相等(忽略大小写),则返回 0
;s1
比 s2
小,则返回负数;s1
比 s2
大,则返回正数。1 | #include <stdio.h> |
看到这里,可能会疑惑 上面不是已经有了 忽略大小写的字符串比较了嘛?
那 strcmpi
和 stricmp
有什么区别呢?
虽然它们的实现功能相同,但是不同的编译器或操作系统可能会提供其中一个或两个函数。在具备这两个函数的系统中,strcmpi
常常作为 VC(Visual C++)
和 Borland C++
的扩展库函数,而 stricmp
则是 POSIX
标准中定义的函数,在许多 类UNIX系统 上可用。因此,如果需要编写可移植的代码,则应该使用 stricmp
函数,而不是 strcmpi
函数。
函数声明 | 函数功能 |
---|---|
int strncmp(const char *s1, const char *s2, size_t n); |
用于比较两个字符串的前n个字符是否相等 |
参数:
返回值:
s1
和 s2
代表的字符串相等(忽略大小写),则返回 0
;s1
比 s2
小,则返回负数;s1
比 s2
大,则返回正数。1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
int strncmpi(const char *s1, const char *s2, size_t n); |
用于比较两个字符串的前n个字符是否相等,忽略大小写 |
参数:
返回值:
s1
和 s2
代表的字符串相等(忽略大小写),则返回 0
;s1
比 s2
小,则返回负数;s1
比 s2
大,则返回正数。1 | #include <stdio.h> |
注意: strncmpi
函数不是 C
语言标准库中的函数,但在某些编译器或操作系统中可能会提供。
函数声明 | 函数功能 |
---|---|
char *strncpy(char *dest, const char *src, size_t n); |
用于将一个字符串的一部分拷贝到另一个字符串中 |
参数:
1 | #include <stdio.h> |
当源字符串长度小于 n
时,strncpy()
函数将在目标字符串的末尾填充 \0
字符以达到指定的拷贝长度 n
1 | #include <stdio.h> |
如果源字符串长度大于等于 n
个字符,strncpy()
函数将会拷贝源字符串的前 n
个字符到目标字符串中,并且不会自动添加末尾的 \0
字符。这种情况下,目标字符串可能不是以 \0
字符结尾,因此需要手动在拷贝后的目标字符串中添加 \0
字符。
函数声明 | 函数功能 |
---|---|
int strnicmp(const char *s1, const char *s2, size_t n); |
用于比较两个字符串的前n个字符是否相等,忽略大小写 |
参数:
返回值:
s1
和 s2
代表的字符串相等(忽略大小写),则返回 0
;s1
比 s2
小,则返回负数;s1
比 s2
大,则返回正数。1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
char *strnset(char *str, int c, size_t n); |
用于将一个字符串的前n个字符都设置为指定的字符 |
参数:
1 | #include <stdio.h> |
注意: strnset()
函数是非标准函数,并不是所有的编译器和操作系统都支持该函数。如果需要跨平台兼容,请使用标准库函数 memset()
来实现类似的功能
1 | #include <stdio.h> |
上述示例使用了标准库函数 memset
来将 str
的前 5
个字符都设置为 *
函数声明 | 函数功能 |
---|---|
char *strpbrk(const char *str1, const char *str2); |
用于在一个字符串中查找任意给定字符集合中的字符的第一次出现位置 |
参数:
注意: 如果在str1
中没有找到str2
中的任何字符,则 strpbrk
函数返回NULL
指针
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
char *strrchr(const char *str, int character); |
在给定的字符串中查找指定字符的最后一个匹配项 |
参数:
返回值:
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
char *strrev(char *str); |
将给定字符串中的所有字符顺序颠倒,并返回颠倒后的字符串 |
参数:
注意:因为 strrev()
函数是一个非标准的库函数,许多编译器可能并不支持该函数,所以在使用该函数之前,请确保你的编译器支持它。
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
char *strset(char *str, int character); |
用于设置给定字符串中的所有字符为指定的值,并返回修改后的字符串 |
参数:
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
size_t strspn(const char *str1, const char *str2); |
计算字符串 str1 中包含在字符串 str2 中的前缀子字符串长度,并返回该长度值 |
参数:
1 | #include <stdio.h> |
上述示例代码运行后,如果出现 error: 'strndup' was not declared in this scope
,说明当前的编译器不支持 strndup()
函数。
因为 strndup()
函数是 C11
新增的函数,因此可能不是所有编译器都支持。
那我们就用如下的方式来替换一下 :
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
char *strstr(const char *str1, const char *str2); |
在字符串 str1 中查找第一个出现的字符串 str2,如果找到了,则返回指向该位置的指针;否则,返回 NULL |
参数:
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
double strtod(const char *str, char **endptr); |
将字符串 str 转换为一个浮点数(double 类型),并返回该浮点数。如果发生了转换错误,则返回 0.0,并且可以通过 endptr 指针返回指向第一个无法转换的字符的指针。 |
参数: |
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
char *strtok(char *str, const char *delim); |
用于将一个字符串分割成多个子字符串 |
参数:
返回值: 分割后的第一个子字符串,并在每次调用时修改传入的原始字符串 str,使其指向下一个要被分割的子字符串
1 | #include <stdio.h> |
在上述的示例中,
str
和 字符集合 delim
;strtok()
函数将字符串 str
按照字符集合 delim
中的分隔符进行分割。每次调用 strtok()
函数时,它会返回分割出的第一个子字符串,并且会修改 str
指向下一个将要被分割的子字符串。strtok()
函数,并输出返回的每个子字符串,直到没有更多的子字符串可以分割为止函数声明 | 函数功能 |
---|---|
long int strtol(const char *str, char **endptr, int base); |
将字符串 str 转换为一个长整型数(long int 类型) |
参数:
2
到 36
之间的有效数字或者 0
。为 0
表示采用默认的进制数,即可以解释成合法的整数的最大进制数(一般是 10
)返回值:
0
,并且可以通过 endptr
指针返回指向第一个无法转换的字符的指针。1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
char *strupr(char *str); |
将字符串 str 中的所有小写字母转换为大写字母,并返回指向该字符串的指针 |
参数:
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
void swab(const void *src, void *dest, ssize_t nbytes); |
将源缓冲区中的每两个相邻字节进行互换,然后将结果存储到目标缓冲区中 |
参数:
1 | #include <stdio.h> |
上面示例中,我在一开始演示时,因为没有加上 #include <unistd.h>
这个头文件,导致出现如下错误:
函数声明 | 函数功能 |
---|---|
int system(const char *command); |
执行一个 shell 或 cmd 命令,并等待命令的完成 |
参数:
shell
或 cmd
命令。下面演示 执行 ls -l
的 shell
命令,笔者是在 windows
环境下运行,故会出错,详见运行结果那里
1 | #include <stdio.h> |
再来看下,演示使用 dir
命令,在 windows
下可以输出当前目录下的所有文件和子目录
1 | #include <stdlib.h> |
函数声明 | 函数功能 |
---|---|
unsigned int sleep(unsigned int seconds); |
它是 C 语言标准库中的函数,用于使当前进程挂起一定的时间。在挂起期间,操作系统会将该进程从调度队列中移除,直到指定的时间过去为止。 |
void Sleep(DWORD milliseconds); |
它是 Windows API 中的一部分,与 sleep 函数类似,它可以使当前线程挂起一段时间。 |
int sopen(const char* filename, int access, int sharemode, int shflag, ...); |
它是 Microsoft Visual C++ 中的一个函数,用于打开文件并返回文件句柄。与标准库中的 fopen 函数不同,sopen 函数支持以二进制方式打开文件,并且可以指定文件读写方式、共享模式和文件访问权限等参数。 |
void sound(int frequency); |
用于发出声音,sound 函数会持续发出声音,直到调用 nosound 函数停止 |
int spawnl(int mode, const char *cmdname, const char *arg0, ..., NULL); |
它是在 Windows 平台上使用的函数,用于启动另一个程序,并等待该程序运行结束后再继续执行本程序 |
int spawnle(int mode, const char *cmdname, const char *arg0, ..., const char *envp[]); |
它是在 Windows 平台上使用的函数,可以启动另一个程序,并通过指定的环境变量传递参数 |
int sprintf(char *str, const char *format, ...); |
用于将格式化的字符串输出到指定的缓冲区中 |
int snprintf(char *str, size_t size, const char *format, ...); |
用于将格式化的字符串输出到指定的缓冲区中,类似于 sprintf 函数,但它可以限制输出字符串的长度,避免缓冲区溢出 |
double sqrt(double x); |
计算 x 的平方根(double) |
float sqrtf(float x); |
计算 x 的平方根 (float) |
long double sqrtl(long double x); |
计算 x 的平方根 (long double) |
void srand(unsigned int seed); |
用于初始化伪随机数生成器 |
int sscanf(const char *str, const char *format, ...); |
用于从字符串中读取数据并进行格式化转换 |
int stat(const char *path, struct stat *buf); |
用于获取文件或目录的属性信息,例如文件大小、创建时间、修改时间等。这些属性信息都被保存在一个名为 struct stat 的结构体中。 |
int stime(const time_t *t); |
它是是 Unix/Linux 系统中的一个系统调用函数,用于设置系统时间 |
char *stpcpy(char *dest, const char *src); |
用于复制一个字符串到另一个字符串缓冲区,并返回目标字符串的结尾指针 |
char* strcat(char* dest, const char* src); |
用于将一个字符串拼接到另一个字符串的末尾 |
char* strchr(const char* str, int c); |
用于查找字符串中第一次出现指定字符的位置,并返回该位置的指针 |
int strcmp(const char* str1, const char* str2); |
用于比较两个字符串是否相等 |
char* strcpy(char* dest, const char* src); |
用于将一个字符串复制到另一个字符串缓冲区中 |
size_t strcspn(const char* str, const char* charset); |
用于查找字符串中第一次出现指定字符集合中任何字符的位置,并返回该位置的索引 |
函数声明 | 函数功能 |
---|---|
unsigned int sleep(unsigned int seconds); |
它是 C 语言标准库中的函数,用于使当前进程挂起一定的时间。在挂起期间,操作系统会将该进程从调度队列中移除,直到指定的时间过去为止。 |
void Sleep(DWORD milliseconds); |
它是 Windows API 中的一部分,与 sleep 函数类似,它可以使当前线程挂起一段时间。 |
sleep 函数参数:
Sleep 函数参数:
1 | #include <stdio.h> |
在使用 sleep()
函数时,将会使当前线程或者进程暂停指定的时间,以便给其他进程或线程执行机会,同时也可以用来控制程序的运行速度。
虽然 sleep()
函数很简单,但是需要注意以下几点:
sleep()
的精度并不高,它所挂起的时间可能会略微超过要求的时间。sleep()
函数是阻塞式的,即在调用 sleep()
函数期间,该进程不能进行任何其他操作,包括响应信号等。sleep()
函数期间,如果发生信号,那么 sleep()
函数将被中断,该进程将继续运行。1 | #include <stdio.h> |
由于 Sleep()
函数是阻塞式的,因此该函数调用期间,当前线程将被阻塞。在函数调用结束后,该线程将恢复运行。
在 Windows
系统下使用 Sleep()
函数时,需要注意以下几点:
Sleep()
函数以毫秒为单位指定时间,精度比 sleep()
函数更高。Sleep()
函数期间,当前线程将被阻塞,不能进行任何其他操作,包括响应信号等。Sleep()
函数期间,如果发生信号,那么 Sleep()
函数将被中断,该线程将继续运行。函数声明 | 函数功能 |
---|---|
int sopen(const char* filename, int access, int sharemode, int shflag, ...); |
它是 Microsoft Visual C++ 中的一个函数,用于打开文件并返回文件句柄。与标准库中的 fopen 函数不同,sopen 函数支持以二进制方式打开文件,并且可以指定文件读写方式、共享模式和文件访问权限等参数。 |
参数:
_O_RDONLY
:只读方式打开文件_O_WRONLY
:只写方式打开文件_O_RDWR
:读写方式打开文件_O_APPEND
:在文件末尾追加数据_O_CREAT
:如果文件不存在,则创建文件_O_TRUNC
:如果文件已存在,清空文件内容_O_EXCL
:与 _O_CREAT
配合使用,如果文件已经存在则打开失败_SH_DENYRW
:独占方式打开文件,其他进程不能读取或写入该文件_SH_DENYWR
:共享读取方式打开文件,其他进程不能写入该文件_SH_DENYRD
:共享写入方式打开文件,其他进程不能读取该文件_SH_DENYNO
:共享方式打开文件,其他进程可以读取和写入该文件_S_IWRITE
:文件可写_S_IREAD
:文件可读_O_CREAT
参数,则需要指定文件的访问权限1 | #include <stdio.h> |
指定文件共享模式,如果没有对应的宏常量,则可以定义如下:
1 | #define _SH_DENYRW 0x10 |
函数声明 | 函数功能 |
---|---|
void sound(int frequency); |
用于发出声音 |
void nosound(void); |
sound 函数会持续发出声音,直到调用 nosound 函数停止 |
参数:
1 | #include <stdio.h> |
Windows 下如果上述出现 error: 'sound' was not declared in this scope
,可以使用如下:
1 | #include <stdio.h> |
注意: 在 Windows
平台上建议使用 Beep()
函数代替 sound()
函数,因为 Beep()
函数不需要特殊的硬件支持,并且可移植性更好。
函数声明 | 函数功能 |
---|---|
int spawnl(int mode, const char *cmdname, const char *arg0, ..., NULL); |
它是在 Windows 平台上使用的函数,用于启动另一个程序,并等待该程序运行结束后再继续执行本程序 |
参数:
P_WAIT
或 P_NOWAIT
NULL
结尾1 | #include <stdio.h> |
1 | #include <process.h> |
如果在使用 spawnl()
函数时遇到了 "Error from spawnl: Invalid argument"
错误,有可能是由于参数传递不正确或要执行的程序不存在等原因导致的。
以下是一些可能导致该错误的情况:
cmdname
参数包含非法字符或格式不正确。NULL
结尾。函数声明 | 函数功能 |
---|---|
int spawnle(int mode, const char *cmdname, const char *arg0, ..., const char *envp[]); |
它是在 Windows 平台上使用的函数,可以启动另一个程序,并通过指定的环境变量传递参数 |
参数:
P_WAIT
或 P_NOWAIT
NULL
结尾1 | #include <process.h> |
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
int sprintf(char *str, const char *format, ...); |
用于将格式化的字符串输出到指定的缓冲区中 |
参数:
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
int snprintf(char *str, size_t size, const char *format, ...); |
用于将格式化的字符串输出到指定的缓冲区中,类似于 sprintf 函数,但它可以限制输出字符串的长度,避免缓冲区溢出 |
参数:
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
double sqrt(double x); |
计算 x 的平方根(double) |
float sqrtf(float x); |
计算 x 的平方根 (float) |
long double sqrtl(long double x); |
计算 x 的平方根 (long double) |
参数:
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
void srand(unsigned int seed); |
用于初始化伪随机数生成器 |
参数:
1 | #include <stdio.h> |
注意: 如果不设置种子值,则每次程序运行时都会得到相同的随机数序列。因此,我们在实际开发中,常常使用时间戳或其他随机值来作为种子值,以确保生成的随机数具有更好的随机性。
函数声明 | 函数功能 |
---|---|
int sscanf(const char *str, const char *format, ...); |
用于从字符串中读取数据并进行格式化转换 |
参数:
1 | #include <stdio.h> |
在上述的示例代码中,我们使用 sscanf()
函数从字符串 "hello world 123"
中读取一个字符串和一个整数,并输出到控制台。
注意: 在格式字符串中,%s
表示读取一个字符串,%d
表示读取一个整数。另外,%*s
表示读取并忽略一个字符串。
函数声明 | 函数功能 |
---|---|
int stat(const char *path, struct stat *buf); |
用于获取文件或目录的属性信息,例如文件大小、创建时间、修改时间等。这些属性信息都被保存在一个名为 struct stat 的结构体中。 |
参数:
struct stat
结构体的指针,用于存储获取到的属性信息返回值:
0
;-1
并设置相应的错误码(存储在 errno
变量中)1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
int stime(const time_t *t); |
它是是 Unix/Linux 系统中的一个系统调用函数,用于设置系统时间 |
参数:
返回值:
0
;-1
并设置相应的错误码(存储在 errno
变量中)1 | #include <stdio.h> |
在如上的示例代码中,
time()
函数获取当前时间,并输出到控制台;2022 年 1 月 1 日
,并等待一秒钟以确保时间设置完成。注意: stime()
函数只能在 Linux/Unix
系统上使用,并且需要 root
权限才能调用。另外,在修改系统时间时应谨慎行事,以避免对系统和应用程序造成不可预料的影响。
函数声明 | 函数功能 |
---|---|
char *stpcpy(char *dest, const char *src); |
用于复制一个字符串到另一个字符串缓冲区,并返回目标字符串的结尾指针 |
参数:
返回值: 一个指向目标字符串结尾的指针
1 | #include <stdio.h> |
在上述的示例代码中,我们使用 stpcpy()
函数将源字符串 "Hello world"
复制到目标字符串 dest
中,并输出两个字符串以及目标字符串的结尾指针。
注意: stpcpy()
函数只能在支持 ISO C99
或 POSIX.1-2001
标准的系统上使用,对于其他系统,可能需要使用 strcpy()
函数代替。此外,应始终确保目标字符串缓冲区具有足够的空间来存储源字符串,以避免发生缓冲区溢出。
函数声明 | 函数功能 |
---|---|
char* strcat(char* dest, const char* src); |
用于将一个字符串拼接到另一个字符串的末尾 |
参数:
返回值: 一个指向目标字符串结尾的指针
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
char* strchr(const char* str, int c); |
用于查找字符串中第一次出现指定字符的位置,并返回该位置的指针 |
参数:
1 | #include <stdio.h> |
注意: strchr()
函数只能查找单个字符,如果要查找一个子字符串,应使用 strstr()
函数代替。另外,在查找字符时,需要将字符转换为整数值传递给 strchr()
函数,以避免发生类型错误。
函数声明 | 函数功能 |
---|---|
int strcmp(const char* str1, const char* str2); |
用于比较两个字符串是否相等 |
参数:
返回值: 一个整数,表示两个字符串之间的大小关系
str1
小于 str2
,则返回负整数;str1
大于 str2
,则返回正整数;str1
等于 str2
,则返回 0。1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
char* strcpy(char* dest, const char* src); |
用于将一个字符串复制到另一个字符串缓冲区中 |
参数:
返回值: 一个指向目标字符串结尾的指针
1 | #include <stdio.h> |
注意: strcpy()
函数只能用于复制以 \0
结尾的字符串,否则可能导致未定义的行为或内存损坏。在调用 strcpy()
函数之前,应确保目标字符串缓冲区具有足够的空间来容纳源字符串,以避免发生缓冲区溢出。
函数声明 | 函数功能 |
---|---|
size_t strcspn(const char* str, const char* charset); |
用于查找字符串中第一次出现指定字符集合中任何字符的位置,并返回该位置的索引 |
参数:
1 | #include <stdio.h> |
在上述的示例代码中,我们使用 strcspn()
函数在字符串 "Hello world"
中查找字符集合 "owd"
中的任何字符,并输出找到的字符及其在字符串中的位置索引。
函数声明 | 函数功能 |
---|---|
void setlinestyle( int linestyle, unsigned upattern, int thickness ); |
设置当前绘图窗口的线条样式、线型模式和线条宽度 |
void *setmem(void *dest, size_t n, int c); |
用于将指定内存区域的每个字节都设置为指定的值 |
int setmode(int fd, int mode); |
它是 Windows 系统下的特定库函数,用于将指定文件的 I/O 模式设置为文本模式或二进制模式 |
void setpalette(int colornum, int color); |
设置调色板的颜色 |
void setrgbpalette(int colornum, int red, int green, int blue); |
用于设置当前绘图窗口的调色板中某个颜色的 RGB 值 |
void settextjustify(int horiz, int vert); |
用于设置文本输出的对齐方式 |
void settextstyle(int font, int direction, int charsize); |
用于设置当前文本输出的字体、方向和大小 |
void settime(struct time *timep); |
设置当前系统时间 |
void setusercharsize(int multx, int dirx, int multy, int diry); |
用于设置用户定义的字符大小 |
int setvbuf(FILE *stream, char *buf, int type, unsigned size); |
用于设置文件流的缓冲方式 |
void setviewport(int left, int top, int right, int bottom, int clipflag); |
用于设置绘图窗口的视口范围 |
void setvisualpage(int pagenum); |
用于设置图形窗口中用户可见的页面 |
void setwritemode(int mode); |
用于设置绘画操作的写入模式 |
void (*signal(int signum, void (*handler)(int)))(int); |
用于设置指定信号的处理方式。当系统接收到某个信号时,会调用相应的信号处理函数来处理该信号。在调用 signal 函数时,需要指定要处理的信号以及相应的信号处理函数。 |
double sin(double x); |
用于计算一个角度(以弧度为单位)的正弦值(double) |
float sinf(float x); |
用于计算一个角度(以弧度为单位)的正弦值(float) |
long double sinl(long double x); |
用于计算一个角度(以弧度为单位)的正弦值(long double) |
void sincos(double x, double* sinVal, double* cosVal); |
用于同时计算一个角度(以弧度为单位)的正弦值和余弦值 |
void sincosf(float x, float* sinVal, float* cosVal); |
用于同时计算一个角度(以弧度为单位)的正弦值和余弦值 |
void sincosl(long double x, long double* sinVal, long double* cosVal); |
用于同时计算一个角度(以弧度为单位)的正弦值和余弦值 |
double sinh(double x); |
用于计算一个数的双曲正弦值 |
float sinhf(float x); |
用于计算一个数的双曲正弦值 |
long double sinhl(long double x); |
用于计算一个数的双曲正弦值 |
函数声明 | 函数功能 |
---|---|
void setlinestyle( int linestyle, unsigned upattern, int thickness ); |
设置当前绘图窗口的线条样式、线型模式和线条宽度 |
参数:
16
位的无符号整数,用二进制位表示线型模式,其中 1
表示绘制线条,0
表示空白。例如,如果 upattern
的值是 0x00FF
,则表示绘制一段线条,然后空白一段,重复这个过程直到结束。如果 upattern
的值是 0x5555
,则表示绘制一段虚线。线条样式 | 值 | 描述 |
---|---|---|
SOLID_LINE | 0 | 实线 |
DOTTED_LINE | 1 | 虚线 |
CENTER_LINE | 2 | 点线 |
DASHED_LINE | 3 | 长短线 |
USERBIT_LINE | 4 | 双点线 |
1 | #include <graphics.h> |
函数声明 | 函数功能 |
---|---|
void *setmem(void *dest, size_t n, int c); |
用于将指定内存区域的每个字节都设置为指定的值 |
参数:
·注意: setmem() 并不是标准 C 函数,而是 POSIX 标准库函数,因此可能并不被所有平台所支持。如果您的编译器或操作系统不支持 setmem() 函数,可以使用标准 C 库函数 memset() 来代替
1 | #include <stdio.h> |
在上面的示例程序中,
malloc()
函数分配了 10
字节的内存空间,并将其赋值给指针变量 str。setmem()
函数将 str
指向的内存区域的每个字节都设置为 'A'
。str
的内容并使用 free()
函数释放了分配的内存空间。函数声明 | 函数功能 |
---|---|
int setmode(int fd, int mode); |
它是 Windows 系统下的特定库函数,用于将指定文件的 I/O 模式设置为文本模式或二进制模式 |
参数:
fileno()
函数将文件指针转换为文件描述符_O_BINARY
:二进制模式_O_TEXT
:文本模式注意: 在 Windows
系统中,文本模式和二进制模式之间的区别在于换行符的处理方式。在文本模式下,Windows
将回车符(\r
)和换行符(\n
)组成的字符序列映射为单个换行符(\n
),因此在读取文本文件时可以正确处理换行符。在二进制模式下,Windows
不对回车符和换行符做任何转换,因此在读取文本文件时可能会出现问题。
1 | #include <stdio.h> |
在上面的示例程序中,我们首先使用 setmode()
函数将标准输入流的模式从二进制模式切换到文本模式;如果调用成功,则返回 0
,否则返回 -1
,并将错误信息存储在全局变量 errno
中。在程序中,我们使用 perror()
函数来输出错误信息。如果调用成功,则输出一条提示信息。
注意: setmode()
函数只适用于 Windows
系统下的 C/C++
编程,并且不是标准库函数,因此在跨平台编程时应该避免使用它。在 Unix/Linux
系统下,也可以使用 fcntl()
函数来设置文件描述符的模式。
函数声明 | 函数功能 |
---|---|
void setpalette(int colornum, int color); |
设置调色板的颜色 |
参数:
RGB
值,也可以是一个预定义颜色名称,例如 RED
或 BLUE
。1 | #include <graphics.h> |
函数声明 | 函数功能 |
---|---|
void setrgbpalette(int colornum, int red, int green, int blue); |
用于设置当前绘图窗口的调色板中某个颜色的 RGB 值 |
参数:
0~255
。RGB
值,取值范围为 0~255
。1 | #include <graphics.h> |
在上述的这个示例程序中,
setbkcolor()
函数设置背景颜色为白色,然后清除原有屏幕使前面设置生效。setrgbpalette()
函数将第 5
种颜色设置为蓝绿色,并使用 setcolor()
函数将绘图颜色设为索引值 5
(即蓝绿色);line()
函数绘制了一条斜线。函数声明 | 函数功能 |
---|---|
void settextjustify(int horiz, int vert); |
用于设置文本输出的对齐方式 |
参数:
LEFT_TEXT
:左对齐CENTER_TEXT
:居中对齐RIGHT_TEXT
:右对齐TOP_TEXT
:顶部对齐CENTER_TEXT
:居中对齐BOTTOM_TEXT
:底部对齐1 | #include <graphics.h> |
在上述的示例程序中,我们使用 settextjustify()
函数将文本输出的对齐方式设置为居中对齐,然后使用 outtextxy()
函数在窗口的中心输出一行文本。
注意: 在使用 settextjustify()
函数设置对齐方式时,必须指定正确的参数值,并且同时考虑水平和垂直方向的对齐方式,否则可能会导致文本输出位置错误。
函数声明 | 函数功能 |
---|---|
void settextstyle(int font, int direction, int charsize); |
用于设置当前文本输出的字体、方向和大小 |
参数:
DEFAULT_FONT
:默认字体TRIPLEX_FONT
:粗体三线字体SMALL_FONT
:小号字体SANS_SERIF_FONT
:无衬线字体GOTHIC_FONT
:哥特式字体SCRIPT_FONT
:手写字体HORIZ_DIR
:水平方向(从左到右)VERT_DIR
:垂直方向(从下到上)DEFAULT_WIDTH
和 DEFAULT_HEIGHT
:默认大小TRIPLEX_WIDTH
和 TRIPLEX_HEIGHT
:大号尺寸SMALL_WIDTH
和 SMALL_HEIGHT
:小号尺寸1 | #include <graphics.h> |
在上述的示例程序中,我们使用 settextstyle()
函数将文本输出的字体设置为粗体三线字体、方向设置为水平方向、大小设置为大号尺寸,然后使用 outtextxy()
函数在窗口的指定位置输出一行文本。
注意: 在使用 settextstyle()
函数设置文本样式时,必须指定正确的参数值,并且根据具体需求灵活选择字体、方向和大小,否则可能会导致文本输出不符合预期。
函数声明 | 函数功能 |
---|---|
void settime(struct time *timep); |
设置当前系统时间 |
参数: |
1 | #include <stdio.h> |
在上述的程序中,
struct time
类型的变量 t
,用于存储当前系统时间。然后使用 gettime()
函数获取当前时间,并将小时、分钟、秒和百分之一秒等信息存储到 t
变量的对应成员变量中。printf()
函数输出了当前的分钟数、小时数、百分之一秒数和秒数。这里使用了 %d
占位符来指定输出整数类型的值。注意 : 这个程序依赖于 DOS
系统提供的日期和时间相关函数,可能无法在其他操作系统或环境下运行。此外,直接修改系统时间可能会对计算机的正常运行产生影响,因此应该谨慎使用。
在现代的 Windows
操作系统中,DOS
环境已经被废弃,因此这个程序可能无法正常工作。如果要获取和修改当前系统时间,可以使用操作系统提供的相关 API
或系统调用接口实现。例如,在 Windows
平台上,可以使用 GetSystemTime()
和 SetSystemTime()
等函数来获取和设置系统时间。
函数声明 | 函数功能 |
---|---|
void setusercharsize(int multx, int dirx, int multy, int diry); |
用于设置用户定义的字符大小 |
参数:
1
或 -1
。当 dirx
的值为 1
时,字符不进行左右翻转;当 dirx
的值为 -1
时,字符进行左右翻转1
或 -1
。当 diry
的值为 1
时,字符不进行上下翻转;当 diry
的值为 -1
时,字符进行上下翻转。1 | #include <graphics.h> |
在上述这个示例程序中,我们使用 setusercharsize()
函数将当前字符的大小设置为水平方向放大 2
倍、垂直方向放大 3
倍,然后使用 outtextxy()
函数在窗口的指定位置输出一行文本。
注意: 在使用 setusercharsize()
函数设置字符大小时,必须指定正确的参数值,并且考虑到水平和垂直方向的缩放倍数,否则可能会导致字符输出不符合预期。
函数声明 | 函数功能 |
---|---|
int setvbuf(FILE *stream, char *buf, int type, unsigned size); |
用于设置文件流的缓冲方式 |
参数:
stdin
)、标准输出流(stdout
)或标准错误流(stderr
),也可以是通过 fopen()
函数打开的文件指针NULL
。如果 buf
参数为 NULL
,则 setvbuf()
函数将自动为文件流分配一块缓冲区_IONBF
:不使用缓冲区,直接从或向设备读写数据_IOLBF
:行缓冲,每行数据结束后刷新缓冲区_IOFBF
:全缓冲,填满缓冲区后才进行读写操作buf
参数不为 NULL
,则 size
参数指定了缓冲区大小;如果 buf
参数为 NULL
,则 size
参数指定了系统为缓冲区分配的大小。size
参数只对全缓冲方式有效,行缓冲和无缓存方式忽略该参数1 | #include <stdio.h> |
在上述的示例程序中,
input
和 output
,分别表示输入文件和输出文件。fopen()
函数打开输入文件和输出文件,并将返回的文件指针保存到对应的变量中。setvbuf()
函数分别为输入文件和输出文件设置缓冲方式。对于输入文件,使用 _IOFBF
缓冲类型和大小为 512
字节的缓冲区;对于输出文件,使用 _IOLBF
缓冲类型和大小为 132
字节的缓冲区(此处 bufr
缓冲区为空指针)。在设置完缓冲方式后,程序根据 setvbuf()
函数的返回值判断是否设置成功,如果返回值不为 0,则说明设置失败,否则说明设置成功,并输出相应的提示信息。fclose()
函数关闭输入文件和输出文件。注意: 在使用文件流进行读写操作时,必须在适当的时候进行缓冲区清理操作,以避免数据丢失或者读取到过期数据等问题。另外,需要根据具体需求选择合适的缓冲方式和缓冲区大小,以实现最优的性能和稳定性。
函数声明 | 函数功能 |
---|---|
void setviewport(int left, int top, int right, int bottom, int clipflag); |
用于设置绘图窗口的视口范围 |
参数:
CLIP_ON
:开启裁剪模式,只显示视口内的图形;CLIP_OFF
:关闭裁剪模式,显示整个画面。1 | #include <graphics.h> |
在上面的示例程序中,
rectangle()
函数绘制了一个红色的矩形;setviewport()
函数将视口范围设置为矩形 (150, 150) - (250, 250);rectangle()
函数绘制了一个绿色的矩形,但这里只有在视口范围的矩形才显示出来。注意: 在使用 setviewport()
函数设置视口范围时,必须指定正确的参数值,并考虑到裁剪模式的影响,否则可能会导致图形显示不符合预期。
函数声明 | 函数功能 |
---|---|
void setvisualpage(int pagenum); |
用于设置图形窗口中用户可见的页面 |
参数:
在双缓冲绘图中,我们通常会使用两个页面来绘制图像,一个是前台页面,另一个是后台页面。当我们绘制完一个完整的画面时,可以通过调用 setactivepage()
函数将后台页面切换到前台页面以显示出来。而 setvisualpage()
函数则用于设置用户当前看到的页面,它实际上是将指定的页面置于前台,从而更新屏幕上显示的内容。
1 | #include <graphics.h> |
上述示例将在屏幕上绘制两个页面,并允许用户通过按任意键查看第二个页面。
注意: setvisualpage()
函数只能用于已经创建的图形窗口,且参数 pagenum
必须在 0
到 getmaxpages()
函数返回值之间。
函数声明 | 函数功能 |
---|---|
void setwritemode(int mode); |
用于设置绘画操作的写入模式 |
参数:
COPY_PUT
:0,复制模式(默认),新绘制的图形将完全覆盖旧图形XOR_PUT
:1,异或模式,新绘制的图形将与旧图形进行异或运算后显示。在这种模式下,如果一个像素既在新图形中出现过,也在旧图形中出现过,则它最终不会被显示出来;如果一个像素只在新图形中出现过,或者只在旧图形中出现过,则它将会被显示出来。OR_PUT
:2,或模式,新绘制的图形将与旧图形进行或运算后显示。在这种模式下,如果一个像素既在新图形中出现过,也在旧图形中出现过,则它最终会被显示出来;如果一个像素只在新图形中出现过,或者只在旧图形中出现过,则它将会被显示出来。1 | #include <graphics.h> |
注意: setwritemode()
函数只对紧随其后的绘画操作生效,它不会影响之前已经绘制的图形。因此,在更改写入模式之前,必须先完成之前的绘画操作。
函数声明 | 函数功能 |
---|---|
void (*signal(int signum, void (*handler)(int)))(int); |
用于设置指定信号的处理方式。当系统接收到某个信号时,会调用相应的信号处理函数来处理该信号。在调用 signal 函数时,需要指定要处理的信号以及相应的信号处理函数。 |
参数:
SIGINT
(中断信号):通常由用户按下 “Ctrl + C
“ 产生,用于中断正在运行的程序。SIGALRM
(闹钟信号):用于在指定的时间后向进程发送信号,可以用于实现定时器等功能。SIGFPE
(浮点异常信号):在发生浮点运算异常时发送该信号。SIGSEGV
(段错误信号):在访问非法的内存地址时发送该信号。void handler(int)
返回值:
SIG_DFL
或 SIG_IGN
)。SIG_ERR
。1 | #include <stdio.h> |
在上面的示例中,
signal()
函数设置了一个处理 SIGINT
信号的处理程序 sigint_handler()
。函数声明 | 函数功能 |
---|---|
double significand(double x); |
用于分离浮点数 x 的尾数部分(double) |
float significandf(float x); |
用于分离浮点数 x 的尾数部分(float) |
参数:
1 | #include <stdio.h> |
注意: 在某些旧版本的编译器中,可能没有实现 significand 函数。这个时候可以考虑使用其他类似的函数来替代,如 frexp
、modf
等。
函数声明 | 函数功能 |
---|---|
double sin(double x); |
用于计算一个角度(以弧度为单位)的正弦值(double) |
float sinf(float x); |
用于计算一个角度(以弧度为单位)的正弦值(float) |
long double sinl(long double x); |
用于计算一个角度(以弧度为单位)的正弦值(long double) |
参数:
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
void sincos(double x, double* sinVal, double* cosVal); |
用于同时计算一个角度(以弧度为单位)的正弦值和余弦值 |
void sincosf(float x, float* sinVal, float* cosVal); |
用于同时计算一个角度(以弧度为单位)的正弦值和余弦值 |
void sincosl(long double x, long double* sinVal, long double* cosVal); |
用于同时计算一个角度(以弧度为单位)的正弦值和余弦值 |
参数:
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
double sinh(double x); |
用于计算一个数的双曲正弦值 |
float sinhf(float x); |
用于计算一个数的双曲正弦值 |
long double sinhl(long double x); |
用于计算一个数的双曲正弦值 |
参数:
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
void *sbrk(intptr_t increment); |
它是一个 Unix 系统的函数,用于调整程序的堆空间。 |
double scalb(double x, double n); |
计算 x 乘以 2 的 n 次幂(double) |
float scalbf(float x, float n); |
计算 x 乘以 2 的 n 次幂(float) |
long double scalbl(long double x, double n); |
计算 x 乘以 2 的 n 次幂(long double) |
double scalbln(double x, long int n); |
计算 x 乘以 2 的指定长整数 n 次幂(double) |
float scalblnf(float x, long int n); |
计算 x 乘以 2 的指定长整数 n 次幂(float) |
long double scalblnl(long double x, long int n); |
计算 x 乘以 2 的指定长整数 n 次幂(long double) |
double scalbn(double x, int n); |
计算 x 乘以 2 的指定整数 n 次幂(double) |
float scalbnf(float x, int n); |
计算 x 乘以 2 的指定整数 n 次幂(float) |
long double scalbnl(long double x, int n); |
计算 x 乘以 2 的指定整数 n 次幂(long double) |
int scanf(const char *format, ...); |
从标准输入中读取指定格式的数据 |
void sector( int x, int y, int stangle, int endangle, int xradius, int yradius ); |
画并填充椭圆扇区(Windows BGI) |
void segread(struct SREGS *sregs); |
它是一个 DOS 函数,用于从内存段(segment )中读取内容。 |
void setactivepage(int pagenum); |
用于切换当前显示的页面 |
void setallpalette(struct palettetype *palette); |
用于设置图形界面的整个调色板 |
void setaspectratio( int xasp, int yasp ); |
设置图形纵横比 |
void setbkcolor(int color); |
用于设置当前绘图窗口的背景色 |
void setbuf(FILE *stream, char *buffer); |
用于设置标准输入流、标准输出流或标准错误流的缓冲方式 |
void setcolor(int color); |
设置当前绘图颜色 |
void setfillpattern(char *upattern, int color); |
用于设置当前绘图窗口的填充图案 |
void setfillstyle(int pattern, int color); |
用于设置当前绘图窗口的填充样式,即用什么颜色或图案来填充绘制的图形 |
void setgraphmode(int mode); |
设置当前的图形模式 |
int setjmp(jmp_buf env); |
用于在程序执行过程中设置跳转点,并将当前程序状态保存到一个缓冲区中。当程序需要从该跳转点继续执行时,可以使用 longjmp() 函数恢复之前保存的程序状态并返回到该跳转点。 |
函数声明 | 函数功能 |
---|---|
void *sbrk(intptr_t increment); |
它是一个 Unix 系统的函数,用于调整程序的堆空间。 |
参数:
返回值:
(void *)-1
1 | #include <unistd.h> |
在上述示例中,
sbrk()
函数将堆顶位置向上移动 64 字节;mem
中;如果 sbrk 调用失败(即返回值等于 (void *)-1)
,则程序通过 perror()
函数输出错误信息并返回 1
;0
表示程序成功运行。函数声明 | 函数功能 |
---|---|
double scalb(double x, double n); |
计算 x 乘以 2 的 n 次幂(double) |
float scalbf(float x, float n); |
计算 x 乘以 2 的 n 次幂(float) |
long double scalbl(long double x, double n); |
计算 x 乘以 2 的 n 次幂(long double) |
注意:如果 n
超过了可表示的范围,或者结果溢出,则函数可能返回正无穷大、负无穷大或 NaN
。
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
double scalbln(double x, long int n); |
计算 x 乘以 2 的指定长整数 n 次幂(double) |
float scalblnf(float x, long int n); |
计算 x 乘以 2 的指定长整数 n 次幂(float) |
long double scalblnl(long double x, long int n); |
计算 x 乘以 2 的指定长整数 n 次幂(long double) |
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
double scalbn(double x, int n); |
计算 x 乘以 2 的指定整数 n 次幂(double) |
float scalbnf(float x, int n); |
计算 x 乘以 2 的指定整数 n 次幂(float) |
long double scalbnl(long double x, int n); |
计算 x 乘以 2 的指定整数 n 次幂(long double) |
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
int scanf(const char *format, ...); |
从标准输入中读取指定格式的数据 |
详细内容 可参考 《scanf》
1 | #include <stdio.h> |
在上述示例中,实现了从标准输入中读取一个字符串,并输出欢迎消息。
name
的字符数组,长度为 20;scanf()
函数从标准输入中读取一个字符串,存储到 name
数组中;printf()
函数输出欢迎消息,其中 %s
表示字符串格式化符号,会被 name
所代替。函数声明 | 函数功能 |
---|---|
void sector( int x, int y, int stangle, int endangle, int xradius, int yradius ); |
画并填充椭圆扇区(Windows BGI) |
参数:
1 | #include <graphics.h> |
函数声明 | 函数功能 |
---|---|
void segread(struct SREGS *sregs); |
它是一个 DOS 函数,用于从内存段(segment )中读取内容。 |
1 | #include <dos.h> |
上述的这个示例程序,使用了 <dos.h>
头文件中的 segread()
函数和 struct SREGS
结构体,并打印出数据段(DS
)、代码段(CS
)和堆栈段(SS
)的值。
函数声明 | 函数功能 |
---|---|
void setactivepage(int pagenum); |
用于切换当前显示的页面 |
1 | #include <graphics.h> |
上述示例将在屏幕上绘制两个页面,并允许用户通过按任意键查看第二个页面。
函数声明 | 函数功能 |
---|---|
void setallpalette(struct palettetype *palette); |
用于设置图形界面的整个调色板 |
参数:
1 | #include <graphics.h> |
函数声明 | 函数功能 |
---|---|
void setaspectratio( int xasp, int yasp ); |
设置图形纵横比 |
参数:
1 | #include <graphics.h> |
注意: 因为 BGI 图形库在 Windows 上的实现是基于 Win32 API 的简单封装,并且没有提供缩放功能,所以上述程序在 Windows BGI 下不支持缩放功能,也就是 setaspectratio 没有效果。
函数声明 | 函数功能 |
---|---|
void setbkcolor(int color); |
用于设置当前绘图窗口的背景色 |
参数:
颜色值 | 英文枚举 | 中文描述 |
---|---|---|
0 | BLACK | 黑 |
1 | BLUE | 蓝 |
2 | GREEN | 绿 |
3 | CYAN | 青 |
4 | RED | 红 |
5 | MAGENTA | 洋红 |
6 | BROWN | 棕 |
7 | LIGHTGRAY | 淡灰 |
8 | DARKGRAY | 深灰 |
9 | LIGHTBLUE | 淡兰 |
10 | LIGHTGREEN | 淡绿 |
11 | LIGHTCYAN | 淡青 |
12 | LIGHTRED | 淡红 |
13 | LIGHTMAGENTA | 淡洋红 |
14 | YELLOW | 黄 |
15 | WHITE | 白 |
1 | #include <graphics.h> |
注意: 在修改背景颜色后,需要使用 cleardevice()
函数清除先前绘制的图形并更新背景颜色,不然背景颜色的修改不会生效。
函数声明 | 函数功能 |
---|---|
void setbuf(FILE *stream, char *buffer); |
用于设置标准输入流、标准输出流或标准错误流的缓冲方式 |
参数:
FILE *stream
: 目标文件流指针(如 stdin, stdout, stderr 或 fopen() 返回的指针)。必须指向已打开的文件流。char *buffer
: 缓冲区指针。1 | #include <stdio.h> |
在上述这个示例程序中,我们打开了一个名为 test.txt
的文件,并使用 setbuf()
函数将其设置为不带缓冲。然后,我们向文件中写入一行文本,关闭文件并退出程序。
由于我们已经将文件设置为不带缓冲,因此写入的数据将直接写入磁盘,而不会在内存中留下缓冲区。
函数声明 | 函数功能 |
---|---|
void setcolor(int color); |
设置当前绘图颜色 |
参数:
颜色值 | 英文枚举 | 中文描述 |
---|---|---|
0 | BLACK | 黑 |
1 | BLUE | 蓝 |
2 | GREEN | 绿 |
3 | CYAN | 青 |
4 | RED | 红 |
5 | MAGENTA | 洋红 |
6 | BROWN | 棕 |
7 | LIGHTGRAY | 淡灰 |
8 | DARKGRAY | 深灰 |
9 | LIGHTBLUE | 淡兰 |
10 | LIGHTGREEN | 淡绿 |
11 | LIGHTCYAN | 淡青 |
12 | LIGHTRED | 淡红 |
13 | LIGHTMAGENTA | 淡洋红 |
14 | YELLOW | 黄 |
15 | WHITE | 白 |
1 | #include <graphics.h> |
函数声明 | 函数功能 |
---|---|
void setfillpattern(char *upattern, int color); |
用于设置当前绘图窗口的填充图案 |
参数:
在调用 setfillpattern()
函数之前,需要先定义一个名为 upattern
的字符数组,并将其用作填充图案。这个图案通常使用一个 8
字节的字节数组表示,每个元素包含一个 8
比特位的掩码,用于表示该位置是否应该被绘制斜线或其他样式。
1 | #include <graphics.h> |
上述程序使用了 Windows BGI 图形库来创建一个空白的图形窗口,并在其中填充一种斜线筛子图案。
何为斜线筛子图案,参考如下程序打印:
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
void setfillstyle(int pattern, int color); |
用于设置当前绘图窗口的填充样式,即用什么颜色或图案来填充绘制的图形 |
参数:
如下是支持的填充样式:
填充样式值 | 英文枚举 | 中文描述 |
---|---|---|
0 | EMPTY_FILL |
空填充(无填充) |
1 | SOLID_FILL |
实心填充 |
2 | LINE_FILL |
横线填充 |
3 | LTSLASH_FILL |
细斜线填充(左斜) |
4 | SLASH_FILL |
粗斜线填充(左斜) |
5 | BKSLASH_FILL |
粗反斜线填充(右斜) |
6 | LTBKSLASH_FILL |
细反斜线填充(右斜) |
7 | HATCH_FILL |
网格阴影填充 |
8 | XHATCH_FILL |
交叉网格填充 |
9 | INTERLEAVE_FILL |
交错线填充 |
10 | WIDE_DOT_FILL |
稀疏点状填充 |
11 | CLOSE_DOT_FILL |
密集点状填充 |
12 | USER_FILL |
用户自定义填充模式 |
setfillstyle()
函数还支持使用用户自定义的填充样式。如果要使用用户自定义的填充样式,需要调用 setuserchars()
函数来设置填充字形,然后将填充样式参数设置为 USER_FILL
。
1 | #include <graphics.h> |
在上述的示例程序中,
setfillstyle()
函数将填充样式设置为斜线筛子图案(即 SLASH_FILL
样式),颜色设置为红色。rectangle()
函数在图形窗口中绘制一个矩形,并使用 floodfill()
函数将该矩形填充为红色的斜线筛子图案。函数声明 | 函数功能 |
---|---|
void setgraphmode(int mode); |
设置当前的图形模式 |
1 | #include <graphics.h> |
函数声明 | 函数功能 |
---|---|
int setjmp(jmp_buf env); |
用于在程序执行过程中设置跳转点,并将当前程序状态保存到一个缓冲区中。当程序需要从该跳转点继续执行时,可以使用 longjmp() 函数恢复之前保存的程序状态并返回到该跳转点。 |
参数:
jmp_buf
类型返回值:
setjmp()
函数返回 0
,除非它是从 longjmp()
函数调用返回的,这种情况下,它返回非零值。
1 | #include <stdio.h> |
在上述的示例程序中,
buf
的 jmp_buf
类型的缓冲区,并将其作为参数传递给 setjmp()
函数,当前程序状态将保存到 buf 缓冲区中,并返回一个整形,用 ret
变量存储;此时 ret
的值为 0,则说明是第一次调用 setjmp()
函数,主函数内打印输出 ”main() before foo()“
foo()
函数,打印输出 ”foo() before longjmp()“
;longjmp()
函数,将会返回到 setjmp()
函数调用的位置,并传递了一个值 1
。因为 longjmp()
调用一定会返回 setjmp()
函数调用的位置,因此 foo()
函数的后面一行代码永远不会被执行。setjmp()
函数返回 ret
的值为 1,则说明是从 longjmp()
函数中返回的,主函数内打印输出 ”main() after longjmp()“
。函数声明 | 函数功能 |
---|---|
int raise(int sig); |
用于向当前进程发送指定的信号。 |
int rand(void); |
用于生成伪随机数 |
ssize_t read(int fd, void *buf, size_t count); |
用于从文件描述符读取数据的函数。 |
void *realloc(void *ptr, size_t size); |
用于重新分配已经分配过内存的空间大小。 |
void rectangle( int left, int top, int right, int bottom); |
画一个矩形 |
int registerbgidriver(void(*driver)(void)); |
用于将BGI(Borland Graphics Interface)驱动程序注册到系统中 |
int remove(char *filename); |
用于删除指定的文件 |
int rename(char *oldname, char *newname); |
用于重命名或移动文件。 |
void restorecrtmode(void); |
将图形模式恢复到文本模式 |
void rewind(FILE *stream); |
将文件指针 stream 指向的文件位置重置为文件开头,同时清除任何错误或文件结束标志。 |
int rmdir(const char *path); |
用于删除一个空目录,即该目录必须为空。 |
double round(double x); |
将传入的实数参数 x 四舍五入为最接近的整数(double) |
float roundf(float x); |
将传入的实数参数 x 四舍五入为最接近的整数(float) |
long double roundl(long double x); |
将传入的实数参数 x 四舍五入为最接近的整数(long double) |
double remainder(double x, double y); |
用于计算两个浮点数的余数(即模运算结果)(double) |
float remainderf (float x, float y ); |
用于计算两个浮点数的余数(即模运算结果)(float) |
long double remainderl (long double x, long double y); |
用于计算两个浮点数的余数(即模运算结果)(long double) |
double remquo(double x, double y, int *quo); |
用于计算两个浮点数的余数,并返回商和余数。 |
float remquof(float x, float y, int *quo); |
用于计算两个浮点数的余数,并返回商和余数。 |
long double remquol(long double x, long double y, int *quo); |
用于计算两个浮点数的余数,并返回商和余数。 |
double rint(double x); |
将 x 四舍五入到最接近的整数(double) |
float rintf(float x); |
将 x 四舍五入到最接近的整数(float) |
long double rintl(long double x); |
将 x 四舍五入到最接近的整数(long double) |
函数声明 | 函数功能 |
---|---|
int raise(int sig); |
用于向当前进程发送指定的信号。 |
参数:
返回值:
raise()
函数将返回 0
;1 | #include <stdio.h> |
在上面的示例中,
signal()
函数设置了一个处理 SIGINT
信号的处理程序 sigint_handler()
。注意:
raise()
函数只能向当前进程发送信号,不能向其他进程发送信号。如果要向其他进程发送信号,可以使用kill()
函数。
函数声明 | 函数功能 |
---|---|
int rand(void); |
用于生成伪随机数 |
返回值:
每次调用它时会返回一个介于 0
和 RAND_MAX
之间的伪随机整数。其中,RAND_MAX
是一个常量,表示返回值的最大值,通常为 32767
。
1 | #include <stdio.h> |
注意:
rand()
函数返回的随机数序列都是相同的。如果要生成不同的随机数序列,可以使用 srand()
函数提供的种子来初始化随机数发生器。rand()
函数只能生成伪随机数,不能保证其真正的随机性。因此,在需要高度安全性的应用程序中,建议使用更加安全的随机数生成器,如 /dev/random
和 /dev/urandom
等系统提供的硬件随机数生成器。函数声明 | 函数功能 |
---|---|
ssize_t read(int fd, void *buf, size_t count); |
用于从文件描述符读取数据的函数。 |
参数:
1 | #include <stdio.h> |
在上述的示例中,
BUFFER_SIZE
的字符数组 buffer
;read()
函数读取标准输入【STDIN_FILENO
表示标准输入的文件描述符】中的数据到 buffer
中;函数声明 | 函数功能 |
---|---|
void *realloc(void *ptr, size_t size); |
用于重新分配已经分配过内存的空间大小。 |
参数:
返回值:
ptr
指向的内存区域大小,并返回一个指向新内存起始地址的指针。NULL
。注意: realloc()
函数并不保证原有的内存区域内容会被完全保留。当内存大小增加时,可能会分配新的内存并将原有的数据复制到新内存区域中;当内存大小减小时,则可能截断部分原有的数据。因此,在使用 realloc()
函数时,需要注意备份原有的数据,以免出现数据丢失的情况。
1 | #include <stdio.h> |
在上面的示例中,
malloc()
函数分配了 10
个整型变量的内存空间,并判断是否分配成功。realloc()
函数将分配的内存空间大小扩充为 20
个整型变量,并判断是否分配成功。注意: 在使用 realloc()
函数时,应该始终检查返回值,以确保分配内存空间成功,避免因内存不足或其他原因导致程序崩溃。另外,也应该避免过度使用 realloc()
函数,因为频繁地重新分配内存会影响程序性能。
函数声明 | 函数功能 |
---|---|
void rectangle( int left, int top, int right, int bottom); |
画一个矩形 |
参数:
left, top, right, bottom,它们分别表示矩形左上角和右下角的坐标。
1 | #include <graphics.h> |
函数声明 | 函数功能 |
---|---|
int registerbgidriver(void(*driver)(void)); |
用于将BGI(Borland Graphics Interface)驱动程序注册到系统中 |
注意:
它必须在使用任何 BGI 图形函数之前调用。该函数接受一个指向驱动程序结构的指针作为参数,并返回一个整数值以指示是否成功注册了驱动程序。BGI 驱动程序主要用于支持 Borland C++ 等 IDE 环境下的图形绘制和显示操作,它们通常存储在一个单独的库文件中,例如 graphics.h
头文件需要使用的 BGI driver 位于 libbgi.a
文件中。
1 | #include <graphics.h> |
函数声明 | 函数功能 |
---|---|
int remove(char *filename); |
用于删除指定的文件 |
参数:
返回值:
返回一个整数表示操作是否成功
0
;1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
int rename(char *oldname, char *newname); |
用于重命名或移动文件。 |
参数:
oldname :
指定要更改的文件名newname :
指定新文件名或包含新路径的新文件名返回值:
0
;1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
void restorecrtmode(void); |
将图形模式恢复到文本模式 |
1 | #include <graphics.h> |
函数声明 | 函数功能 |
---|---|
void rewind(FILE *stream); |
将文件指针 stream 指向的文件位置重置为文件开头,同时清除任何错误或文件结束标志。 |
1 | #include <stdio.h> |
在上述的示例中,
tempnew.txt
的文件;fgets()
函数从文件中读取文本行,并输出内容;rewind()
函数将文件指针重置到文件开头,并再次读取文件内容并输出;函数声明 | 函数功能 |
---|---|
int rmdir(const char *path); |
用于删除一个空目录,即该目录必须为空。 |
参数:
返回值:
0
;-1
,并设置 errno
错误码。1 | #include <stdio.h> |
在上述的示例中,
test
的目录;file1.txt
和 file2.txt
;rmdir()
函数尝试删除该目录,但会失败,因为该目录不是空的。注意: 如果要删除非空目录,可以使用上面的 remove()
函数来删除目录及其所有内容。
函数声明 | 函数功能 |
---|---|
double round(double x); |
将传入的实数参数 x 四舍五入为最接近的整数(double) |
float roundf(float x); |
将传入的实数参数 x 四舍五入为最接近的整数(float) |
long double roundl(long double x); |
将传入的实数参数 x 四舍五入为最接近的整数(long double) |
1 | #include <math.h> |
函数声明 | 函数功能 |
---|---|
double remainder(double x, double y); |
用于计算两个浮点数的余数(即模运算结果)(double) |
float remainderf (float x, float y ); |
用于计算两个浮点数的余数(即模运算结果)(float) |
long double remainderl (long double x, long double y); |
用于计算两个浮点数的余数(即模运算结果)(long double) |
参数:
返回值: x/y
的余数
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
double remquo(double x, double y, int *quo); |
用于计算两个浮点数的余数,并返回商和余数。 |
float remquof(float x, float y, int *quo); |
用于计算两个浮点数的余数,并返回商和余数。 |
long double remquol(long double x, long double y, int *quo); |
用于计算两个浮点数的余数,并返回商和余数。 |
参数:
NULL
返回值: 返回 x/y
的余数,并通过 quo
指针返回商。
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
double rint(double x); |
将 x 四舍五入到最接近的整数(double) |
float rintf(float x); |
将 x 四舍五入到最接近的整数(float) |
long double rintl(long double x); |
将 x 四舍五入到最接近的整数(long double) |
1 | #include <stdio.h> |
函数声明 | 函数功能 |
---|---|
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); |
用于将指定数组按指定顺序进行排序 |
void quick_exit(int status); |
它是 C11 标准中新增的函数,用于快速退出程序并执行一些清理操作。它类似于 exit() 函数,但不会调用 atexit() 注册的函数,并且不会刷新标准 I/O 流(例如 stdout 和 stderr )。 |
int qunsetenv(const char *name); |
用于从进程环境中移除指定的环境变量。该函数在某些操作系统上可能不可用,因为它并非标准的 C 语言函数,而是 POSIX 标准中定义的函数。 |
QuRT相关的函数 | 详见 4.1 所示 |
函数声明 | 函数功能 |
---|---|
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); |
用于将指定数组按指定顺序进行排序 |
参数: |
1 | #include <stdio.h> |
在上述的示例中,
arr
,并计算出数组的长度,赋值给 n
;"Before sorting: 5 2 8 4 1 9 3 6 7"
qsort()
函数将其按照升序排列。qsort()
函数中传入一个比较函数 compare()
,用于比较两个元素的值。”After sorting: 1 2 3 4 5 6 7 8 9“
。注意: 在编写比较函数时,需要根据元素的实际类型进行转换,并确保返回值符合要求(小于零表示第一个元素小于第二个元素,等于零表示两个元素相等,大于零表示第一个元素大于第二个元素)。此外,还需要特别注意参数类型和返回值类型的 const
限定符。
函数声明 | 函数功能 |
---|---|
void quick_exit(int status); |
它是 C11 标准中新增的函数,用于快速退出程序并执行一些清理操作。它类似于 exit() 函数,但不会调用 atexit() 注册的函数,并且不会刷新标准 I/O 流(例如 stdout 和 stderr )。 |
参数: |
1 | #include <stdio.h> |
在如上的示例中,
at_quick_exit()
函数注册一个清理函数 cleanup()
,当程序使用 quick_exit()
函数退出时,该函数会自动执行。quick_exit()
函数并传入状态码 EXIT_SUCCESS
表示程序正常退出。注意: 在使用 quick_exit()
函数时需要特别小心,因为它不会调用 atexit()
注册的函数,并且可能导致一些资源泄漏或未完成的操作。只有在必须立即结束程序并执行清理操作时,才应该使用该函数。
函数声明 | 函数功能 |
---|---|
int qunsetenv(const char *name); |
用于从进程环境中移除指定的环境变量。该函数在某些操作系统上可能不可用,因为它并非标准的 C 语言函数,而是 POSIX 标准中定义的函数。 |
参数: |
返回值:
0
;1 | #include <stdlib.h> |
在上述这个示例程序中,
setenv()
函数设置了一个名为 MY_VAR
的环境变量;qunsetenv()
函数移除了这个环境变量;NULL
,则说明环境变量已经被成功移除了。注意: 使用 qunsetenv()
函数可以修改当前进程的环境变量,但是对于其他进程或子进程来说,它们的环境变量不受影响。此外,一些操作系统可能不支持对环境变量进行动态修改,因此无法保证 qunsetenv()
函数在所有平台上都能正常工作。
函数声明 | 函数功能 |
---|---|
void *qurt_sysenv_getvirtaddr(void *phys_addr, unsigned int size); |
将物理地址转换为虚拟地址。 |
void *qurt_malloc(unsigned int size); |
动态分配内存 |
void *qurt_calloc(unsigned int nmemb, unsigned int size); |
动态分配内存,并初始化为零。 |
void qurt_free(void *ptr); |
释放动态分配的内存。 |
int qurt_thread_create(qurt_thread_t *tid, const qurt_thread_attr_t *attr, void (*start)(void *), void *arg); |
创建新线程。 |
int qurt_thread_join(qurt_thread_t tid, int *status); |
等待线程结束并释放其资源。 |
unsigned int qurt_thread_get_priority(qurt_thread_t thread); |
用于获取指定线程的优先级。其中参数 thread 是要获取优先级的线程的句柄。返回一个无符号整数,表示线程的优先级。 |
void qurt_thread_set_priority(qurt_thread_t thread, unsigned int priority); |
用于设置指定线程的优先级。其中参数 thread 是要设置优先级的线程的句柄,而参数 priority 是要设置的优先级值。 |
char *qurt_thread_get_name(char *name, qurt_thread_t thread); |
用于获取指定线程的名称。其中参数 name 是一个指向存储线程名称的缓冲区的指针,而参数 thread 是要获取名称的线程的句柄。返回一个指向缓冲区中存储线程名称的指针。 |
void qurt_thread_set_name(qurt_thread_t thread, const char *name); |
用于设置指定线程的名称。其中参数 thread 是要设置名称的线程的句柄,而参数 name 是要设置的线程名称。 |
int qurt_thread_stop(qurt_thread_t thread); |
用于停止指定线程的执行,即立即终止线程的运行。其中参数 thread 是要停止执行的线程的句柄。返回一个整数值,表示是否成功停止线程。如果成功,则返回 0 ;否则返回一个负数错误代码。 |
int qurt_thread_resume(qurt_thread_t thread); |
用于恢复指定线程的执行,即让线程从上次暂停处继续运行。其中参数 thread 是要恢复执行的线程的句柄。返回一个整数值,表示是否成功恢复线程。如果成功,则返回 0 ;否则返回一个负数错误代码。 |
void qurt_mutex_init(qurt_mutex_t *mutex); |
用于初始化一个互斥锁,即在使用之前必须进行初始化。其中参数 mutex 是指向要初始化的互斥锁对象的指针。 |
void qurt_mutex_lock(qurt_mutex_t *mutex); |
用于以阻塞方式获取一个互斥锁。如果该互斥锁已被其他线程锁定,则当前线程将一直等待,直到可以获取该锁。其中参数 mutex 是指向要获取的互斥锁对象的指针。 |
void qurt_mutex_unlock(qurt_mutex_t *mutex); |
用于释放一个互斥锁,即解除对该互斥锁的占用。其中参数 mutex 是指向要释放的互斥锁对象的指针。 |
void qurt_timer_sleep(unsigned int ticks); |
用于让当前线程进入休眠状态,休眠时间由参数 ticks 指定(每个 tick 的长度取决于系统时钟频率)。在休眠期间,该线程将不会被调度执行。注意,该函数可能会提前唤醒线程,因此休眠时间并不精确。 |
void qurt_signal_init(qurt_signal_t *signal); |
用于初始化一个信号量,即在使用之前必须进行初始化。其中参数 signal 是指向要初始化的信号量对象的指针。 |
unsigned int qurt_signal_wait(qurt_signal_t *signal, unsigned int mask, unsigned int option, unsigned int *ret_signal); |
用于等待一个或多个信号量的触发。其中参数 signal 是指向要等待的信号量对象的指针,参数 mask 表示要等待哪些信号量,参数 option 用于指定等待的行为选项,参数 ret_signal 用于返回实际触发的信号量。 |
void qurt_signal_set(qurt_signal_t *signal, unsigned int mask); |
用于触发一个或多个信号量。其中参数 signal 是指向要触发的信号量对象的指针,参数 mask 表示要触发哪些信号量。 |
void qurt_signal2_init(qurt_signal2_t *signal); |
用于初始化一个带有两个信号量的信号量对象。其中参数 signal 是指向要初始化的信号量对象的指针。 |
void qurt_signal2_destroy(qurt_signal2_t *signal); |
用于销毁带有两个信号量的信号量对象,并释放其占用的内存空间。其中参数 signal 是要销毁的信号量对象的指针。 |
void qurt_signal2_set(qurt_signal2_t *signal, unsigned int mask); |
用于设置带有两个信号量的信号量对象中的一个或多个信号量。其中参数 signal 是要设置信号量的信号量对象的指针,而参数 mask 是一个 32 位无符号整数,表示要设置的信号量掩码。掩码中每个位代表一个信号量,如果该位为 1 ,则表示相应的信号量被设置;如果该位为 0 ,则表示相应的信号量未被设置。 |
unsigned int qurt_signal2_wait(qurt_signal2_t *signal, unsigned int mask, unsigned int options); |
用于等待带有两个信号量的信号量对象中指定的信号量被触发。其中参数 signal 是要等待的信号量对象的指针,而参数 mask 是一个 32 位无符号整数,表示要等待的信号量掩码。掩码中每个位代表一个信号量,如果该位为 1 ,则表示相应的信号量需要被触发;如果该位为 0 ,则表示相应的信号量不需要被触发。参数 options 则指定等待信号量的选项,例如是否超时等。它返回一个 32 位无符号整数,表示哪些信号量已被触发。返回值中每个位代表一个信号量,如果该位为 1 ,则表示相应的信号量已被触发;如果该位为 0 ,则表示相应的信号量未被触发。 |
void qurt_timer_create(qurt_timer_t *timer, const char *name); |
用于创建一个新的定时器。其中参数 timer 是指向要创建的定时器对象的指针,参数 name 是定时器的名称(可以为 NULL )。 |
void qurt_timer_delete(qurt_timer_t timer); |
用于删除一个已经创建的定时器。其中参数 timer 是要删除的定时器对象。 |
void qurt_timer_start(qurt_timer_t timer, uint32_t duration); |
用于启动一个定时器,并指定定时器的超时时间。其中参数 timer 是要启动的定时器对象,参数 duration 是定时器的超时时间(以 tick 为单位)。 |
void qurt_timer_stop(qurt_timer_t timer); |
用于停止一个已经运行的定时器。其中参数 timer 是要停止的定时器对象。 |
qurt_thread_t qurt_thread_get_id(void); |
用于获取当前线程的 ID 。 |
int qurt_mem_region_create(qurt_mem_region_t *region, unsigned int size, qurt_mem_cache_mode_t cache_attrib, qurt_mem_region_type_t type); |
用于创建一个内存区域对象,并分配指定大小的内存空间。其中参数 region 是指向要创建的内存区域对象的指针,参数 size 指定内存区域的大小,而 cache_attrib 和 type 分别指定内存区域的缓存属性和类型。返回一个整数值,表示是否成功创建内存区域。如果成功,则返回 0 ;否则返回一个负数错误代码。 |
int qurt_mem_region_delete(qurt_mem_region_t region); |
用于删除指定的内存区域对象,并释放其占用的内存空间。其中参数 region 是要删除的内存区域对象的句柄。返回一个整数值,表示是否成功删除内存区域。如果成功,则返回 0 ;否则返回一个负数错误代码。 |
void qurt_mem_region_attr_init(qurt_mem_region_attr_t *attr); |
用于初始化一个内存区域属性对象。其中参数 attr 是指向要初始化的内存区域属性对象的指针。 |
int qurt_mem_pool_create(qurt_mem_pool_t *pool, void *baseaddr, unsigned int size, qurt_mem_cache_mode_t cache_attrib); |
用于创建一个内存池对象,并分配指定大小的内存空间。其中参数 pool 是指向要创建的内存池对象的指针,参数 baseaddr 指定内存池的起始地址,而 size 和 cache_attrib 分别指定内存池的大小和缓存属性。返回一个整数值,表示是否成功创建内存池。如果成功,则返回 0 ;否则返回一个负数错误代码。 |
int qurt_mem_pool_delete(qurt_mem_pool_t pool); |
用于删除指定的内存池对象,并释放其占用的内存空间。其中参数 pool 是要删除的内存池对象的句柄。返回一个整数值,表示是否成功删除内存池。如果成功,则返回 0 ;否则返回一个负数错误代码。 |
int qurt_pipe_create(qurt_pipe_t *pipe, unsigned int pipe_type, unsigned int pipe_elements, unsigned int elem_size); |
用于创建一个管道对象,并分配指定大小的内存空间。其中参数 pipe 是指向要创建的管道对象的指针,参数 pipe_type 指定管道类型,参数 pipe_elements 指定管道元素个数,而 elem_size 指定每个管道元素的大小。 返回一个整数值,表示是否成功创建管道。如果成功,则返回 0 ;否则返回一个负数错误代码。 |
int qurt_pipe_delete(qurt_pipe_t pipe); |
用于删除指定的管道对象,并释放其占用的内存空间。其中参数 pipe 是要删除的管道对象的句柄。返回一个整数值,表示是否成功删除管道。如果成功,则返回 0 ;否则返回一个负数错误代码。 |
int qurt_pipe_send(qurt_pipe_t pipe_id, void *buf, unsigned int size, unsigned int timeout); |
用于向指定的管道发送数据。其中参数 pipe_id 是要发送数据的管道对象的句柄,参数 buf 指向要发送的数据缓冲区,参数 size 指定要发送的数据大小,而 timeout 指定等待发送操作完成的超时时间(单位为 ticks)。 返回一个整数值,表示是否成功发送数据。如果成功,则返回 0 ;否则返回一个负数错误代码。 |
int qurt_pipe_receive(qurt_pipe_t pipe_id, void *buf, unsigned int size, unsigned int *recv_size, unsigned int timeout); |
用于从指定的管道接收数据。其中参数 pipe_id 是要接收数据的管道对象的句柄,参数 buf 指向接收数据的缓冲区,参数 size 指定要接收的数据大小,而 recv_size 是一个指针,用于返回实际接收到的数据大小。参数 timeout 指定等待接收操作完成的超时时间(单位为 ticks )。返回一个整数值,表示是否成功接收数据。如果成功,则返回 0;否则返回一个负数错误代码。 |
1 | #include <stdio.h> |
在上述的示例中,我们使用 qurt_thread_create()
函数创建了两个线程,分别执行 task1()
和 task2()
函数,并使用 qurt_thread_join()
函数等待它们结束。
注意: 在开发过程中,需要根据实际情况合理使用内存管理函数和多任务调度函数,并避免出现死锁、资源泄漏等问题。
1 | #include "qurt.h" |
在上面这个示例程序中,
qurt_mutex_init()
函数初始化了一个互斥锁对象。increment_global_counter()
函数来增加全局计数器 global_counter
的值。由于多个线程可能同时访问该共享资源,因此在访问之前需要先获取互斥锁,以避免竞争条件的发生。在 increment_global_counter()
函数中,我们使用 qurt_mutex_lock()
函数获取互斥锁,并使用 qurt_mutex_unlock()
函数释放互斥锁。1 | #include "qurt.h" |
在上述的示例程序中,
qurt_signal_init()
函数初始化了一个信号量对象。qurt_signal_wait()
函数等待信号量,当信号量触发时才能访问共享资源,并使用 qurt_signal_set()
函数释放信号量。qurt_thread_join()
函数等待两个线程结束;1 | #include "qurt.h" |
在上述的示例程序中,
qurt_timer_create()
函数创建了一个定时器。qurt_timer_start()
函数启动了该定时器,并指定了定时器的超时时间(1000
毫秒)。qurt_timer_set_attr()
函数注册了定时器回调函数。10
毫秒调用 qurt_timer_sleep()
函数进入休眠状态,等待定时器超时。当定时器超时时,将触发定时器回调函数 timer_callback(),输出一条消息。注意: 在程序结束时需要使用 qurt_timer_stop()
停止定时器,并使用 qurt_timer_delete()
删除定时器对象。
1 | #include "qurt.h" |
在上述这个示例程序中,
qurt_mem_region_create()
函数创建了一个大小为 SHM_SIZE
的共享内存区域,并设置其缓存属性为 QURT_MEM_CACHE_NONE
,类型为 QURT_MEM_REGION_SHARED
,并且具有读写权限。printf()
函数打印了从共享内存区域中读取的数据。qurt_mem_region_delete()
函数删除了共享内存区域。1 | #include "qurt.h" |
在上述示例程序中,
qurt_pipe_create()
函数创建一个大小为 1024 字节的管道对象,属性设置为阻塞式字节队列。qurt_thread_create()
函数创建了一个名为 child
的子线程,并将管道对象传递给它。我们在 child_thread()
函数中调用了 qurt_pipe_receive()
函数来从管道接收数据,然后使用 printf()
函数打印出接收到的字符串。msg
,并使用 qurt_pipe_send()
函数向管道发送该字符串。qurt_pipe_delete()
函数删除了管道对象。