C语言作为一种底层编程语言,提供了丰富的API函数供开发者使用,这些API函数涵盖了从基本的输入输出操作到复杂的系统调用和网络通信等多个方面,以下是一些常用的C API函数及其简要说明:
函数名 | 功能描述 |
printf |
向标准输出(通常是屏幕)打印格式化字符串。 |
scanf |
从标准输入(通常是键盘)读取格式化输入。 |
fopen |
打开一个文件,并返回指向该文件的指针。 |
fclose |
关闭一个由fopen 打开的文件。 |
fread |
从文件流中读取数据。 |
fwrite |
向文件流中写入数据。 |
malloc |
动态分配内存空间,并返回指向该内存的指针。 |
free |
释放由malloc 或calloc 分配的内存空间。 |
qsort |
对数组进行快速排序。 |
bsearch |
在已排序的数组中执行二分查找。 |
strcpy |
将源字符串复制到目标字符串中。 |
strcat |
将源字符串连接到目标字符串的末尾。 |
strcmp |
比较两个字符串的大小。 |
strlen |
计算字符串的长度。 |
system |
执行一个系统命令,并返回其退出状态。 |
fork |
创建一个新的进程。 |
exec |
在当前进程中执行一个新程序。 |
wait |
等待子进程结束,并获取其状态。 |
pipe |
创建一个管道,用于进程间通信。 |
dup |
复制文件描述符。 |
dup2 |
复制文件描述符,并指定新文件描述符的编号。 |
getpid |
获取当前进程的PID。 |
getppid |
获取父进程的PID。 |
sleep |
使当前进程暂停执行一段时间(以秒为单位)。 |
usleep |
使当前进程暂停执行一段时间(以微秒为单位)。 |
nanosleep |
使当前进程暂停执行一段时间(以纳秒为单位)。 |
gettimeofday |
获取当前的时间,精确到微秒级。 |
localtime |
将时间转换为本地时间表示。 |
gmtime |
将时间转换为UTC时间表示。 |
strftime |
根据指定的格式将时间转换为字符串。 |
pthread_create |
创建一个新线程。 |
pthread_join |
等待一个线程结束。 |
pthread_mutex_lock |
加锁一个互斥量。 |
pthread_mutex_unlock |
解锁一个互斥量。 |
pthread_cond_wait |
等待条件变量被触发。 |
pthread_cond_signal |
触发条件变量,唤醒一个等待的线程。 |
socket |
创建一个套接字。 |
bind |
将套接字与一个地址绑定。 |
listen |
开始监听套接字上的连接请求。 |
accept |
接受一个套接字上的连接请求。 |
connect |
发起一个到指定地址的连接请求。 |
send |
通过套接字发送数据。 |
recv |
通过套接字接收数据。 |
select |
监视多个文件描述符的状态变化。 |
poll |
类似于select ,但可以处理更多的文件描述符。 |
epoll |
一种高效的I/O事件通知机制。 |
getaddrinfo |
根据主机名和服务名获取地址信息。 |
getnameinfo |
根据地址信息获取主机名和服务名。 |
htons |
将主机字节序转换为网络字节序(短整型)。 |
ntohs |
将网络字节序转换为主机字节序(短整型)。 |
htonl |
将主机字节序转换为网络字节序(长整型)。 |
ntohl |
将网络字节序转换为主机字节序(长整型)。 |
Q1: C语言中的malloc
和calloc
有什么区别?
A1:malloc
和calloc
都是用于动态内存分配的函数,但它们之间有几个关键的区别:
malloc
分配的内存块不会被初始化,内容是未定义的;而calloc
分配的内存块会被初始化为零。
malloc
只需要一个参数,即要分配的内存大小(以字节为单位);而calloc
需要两个参数,第一个是要分配的元素数量,第二个是每个元素的大小(以字节为单位)。
由于calloc
会初始化内存,因此它通常比malloc
稍慢一些。
Q2: C语言中的fork
和vfork
有什么区别?
A2:fork
和vfork
都是用于创建新进程的函数,但它们的行为和用途有所不同:
fork
是标准的Unix函数,它会创建一个新的子进程,该子进程是父进程的副本,父进程和子进程拥有独立的地址空间,因此它们不会相互干扰。
vfork
(在某些系统中也称为_vfork
)是fork
的一个变体,它主要用于提高性能,与fork
不同,vfork
不会为子进程复制父进程的地址空间,而是让子进程直接使用父进程的地址空间,这意味着子进程可以修改父进程的数据,但这也带来了潜在的风险和复杂性,在现代操作系统中,由于性能和安全性的原因,vfork
已经很少使用了。