Advanced Programming in UNIX Environment Episode 62
发布日期:2021-10-07 23:47:39 浏览次数:2 分类:技术文章

本文共 2613 字,大约阅读时间需要 8 分钟。

Reentrancy

POSIX.1 provides a way to manage FILE objects in a thread-safe way. You can use flockfile and ftrylockfile to obtain a lock associated with a given FILE object. This lock is recursive: you can acquire it again, while you already hold it, without deadlocking. Although the exact implementation of the lock is unspecified, all standard I/O routines that manipulate FILE objects are required to behave as if they call flockfile and funlockfile internally.

#include 
int ftrylockfile(FILE *fp);void flockfile(FILE *fp);

If the standard I/O routines acquire their own locks, then we can run into serious performance degradation when doing character-at-a-time I/O. In this situation, we end up acquiring and releasing a lock for every character read or written. To avoid this overhead, unlocked versions of the character-based standard I/O routines are available.

#include 
int getchar_unlocked(void);int getc_unlocked(FILE *fp);int putchar_unlocked(int c);int putc_unlocked(int c, FILE *fp);
#include 
#include
#define MAXSTRINGSZ 4096static char envbuf[MAXSTRINGSZ];extern char **environ;char *getenv(const char *name){ int i,len; len=strlen(name); for(i=0;environ[i]!=NULL;i++) { if((strncmp(name,environ[i],len)==0)&& (environ[i][len]=='=')) { strncpy(envbuf,&environ[i][len+1],MAXSTRINGSZ-1); return envbuf; } } return NULL;}

A nonreentrant version of getenv

#include 
#include
#include
#include
extern char **environ;pthread_mutex_t env_mutex;static pthread_once_t init_done=PTHREAD_ONCE_INIT;static void thread_init(void){ pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&env_mutex,&attr); pthread_mutexattr_destroy(&attr);}int getenv_r(const char *name, char *buf, int buflen){ int i, len, olen; pthread_once(&init_done, thread_init); len=strlen(name); pthread_mutex_lock(&env_mutex); for(i=0;environ[i]!=NULL;i++) { if((strncmp(name,environ[i],len)==0)&& (environ[i][len]=='=')) { olen=strlen(&environ[i][len+1]); if(olen>=buflen) { pthread_mutex_unlock(&env_mutex); return ENOSPC; } strcpy(buf, &environ[i][len+1]); pthread_mutex_unlock(&env_mutex); return 0; } } pthread_mutex_unlock(&env_mutex); return ENOENT;}

A reentrant (thread-safe) version of getenv

转载地址:https://blog.csdn.net/myfather103/article/details/79975134 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Advanced Programming in UNIX Environment Episode 63
下一篇:Advanced Programming in UNIX Environment Episode 61

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年02月29日 22时56分15秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

java integer 不变模式_Java代码的变与不变 2019-04-21
java guava 使用_Java8-Guava实战示例 2019-04-21
python barrier option pricing_《Python金融数据分析》书内代码实战与讲解(二)金融衍生物定价... 2019-04-21
java自带工具_深入了解Java JDK自带工具,包括javac、jar、jstack等,实用~ 2019-04-21
gnome mysql client_解决MySQLWorkbenchgnome-keyring-daemon错误的方法分享 2019-04-21
java线程占用CPU_在windows下揪出java程序占用cpu很高的线程并完美解决 2019-04-21
java多态替换switch_使多态性无法解决那些switch / case语句的麻烦 2019-04-21
java httpclient 进度条_如何使用Apache HttpClient 4获取文件上传的进度条? 2019-04-21
下列不属于java语言特点的是_下列选项中,不属于Java语言特点的一项是( )。... 2019-04-21
java中小数的乘法_javascript的小数点乘法除法实例 2019-04-21
kappa一致性检验教程_SPSS在线_SPSSAU_Kappa一致性检验 2019-04-21
linux shell mysql备份_linux shell 备份mysql 数据库 2019-04-21
Java双向链表时间复杂度_链表是什么?有多少种链表?时间复杂度是? 2019-04-21
unity3d能和java系统整合吗_Android与Unity3d的整合 2019-04-21
minecraft666java_我的世界的666的世界 2019-04-21
辽宁师范大学java_辽宁师范大学心理学院 2019-04-21
java程序有连接数据库_Java程序连接数据库 2019-04-21
java reduce.mdn_reduce高级用法 2019-04-21
java shape用法_Java PShape.scale方法代码示例 2019-04-21
java字符串三目_java字符串连接运算符和三目运算符 2019-04-21