Linux应用编程: API基础

1. 前言

限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。^_^

2. API基础

要编写一个Linux系统下的应用程序,少不了要调用API(glibc,syscall等)。那么我们对API的调用,应该具备哪些基础知识呢?你可能会说,调用API需要什么基础知识,直接调用就好了!果真如此吗?很不幸事实并非如此。如果能回答如下问题,那么你可以结束当前阅读;但如果不是,继续阅读是有必要的。


. 什么样的函数是可重入的(Reentrant Function)?
. 什么样的函数是线程安全的(Thread-Safe)?
. 什么样的函数异步信号安全的(Async-Signal-Safe Function)?

我们可以从POSIX文档里面找到关于上面3个概念的定义:

Reentrant Function

A function whose effect, when called by two or more threads, is guaranteed to be as if the threads each executed the function one after another in an undefined order, even if the actual execution is interleaved.

Thread-Safe

A function that may be safely invoked concurrently by multiple threads. Each function defined in the System Interfaces volume of IEEE Std 1003.1-2001 is thread-safe unless explicitly stated otherwise.

Async-Signal-Safe Function

A function that may be invoked, without restriction, from signal-catching functions. No function is async-signal-safe unless explicitly described as such.

一个API的属性,决定了它在哪些场合下可以使用。如果不了解这些,编写复杂的程序,将会BUG丛生。我们来简单地解释下上面3个概念:

可重入函数(Reentrant Function)
当函数被多个线程并发调用时,不管函数以怎样的顺序执行,只要调用线程给定的输入参数是相同,就必定得到相同的结果输出。
譬如使用了全局 pthread_mutex_t 的函数,就不是可重入的,因为重入时上锁会造成死锁。

线程安全(Thread-Safe)
函数安全的被多个线程并发调用。

异步信号安全(Async-Signal-Safe Function)
简单来讲,可以在信号处理函数中调用的函数,就是异步信号安全。
大多数函数都不是这一类,除非显式标明。

一个可重入函数必定是【线程安全】以及【异步信号安全的】,但反之则不一定。

3. 如何确认一个函数的可使用场合?

我们在没有源码的情形下,可使用 man 查看标准API的使用场合。如:man strtok

┌────────────────────────┬───────────────┬───────────────────────┐
│Interface               Attribute     Value                 │
├────────────────────────┼───────────────┼───────────────────────┤
│strtok()                │ Thread safety │ MT-Unsafe race:strtok │
├────────────────────────┼───────────────┼───────────────────────┤
│strtok_r()              │ Thread safety │ MT-Safe               │
└────────────────────────┴───────────────┴───────────────────────┘

4. 更多细节
了解更多的细节,可以参考 POSIX 规范, APUE等资料。
要彻底了解细节,需要了解OS的锁机制以及信号处理处理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值