信号处理程序中调用不可重入函数getpwnam 起结果是不可预见的。

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
<bldc:/home/tingbinz/apue.2e/include/10>R*_*G:vim 10_2.c
#include "apue.h"
#include <pwd.h>




static void my_alarm(int signo)
{
        struct passwd *rootptr;
        printf("in signal handler\n");
        if((rootptr = getpwnam("root")) == NULL )
        {
                err_sys("failed to get information of root");
        }
        else
                printf("uname:%s\n",rootptr->pw_name);
        alarm(1);
}


int main (void)
{
        struct passwd *ptr;
        signal(SIGALRM,my_alarm);
        alarm(1);
        for(; ;)
        {
                if( (ptr = getpwnam("tingbinz")) == NULL)
                        err_sys("failed to get information of tingbinz");
                if( strcmp(ptr->pw_name,"tingbinz") != 0)
                        printf("error occur during reload function of main,uname in main function is:%s\n",ptr->pw_name);
        }
        return 0;
}
~
~
~
~
~
~
~
~
~
~

"10_2.c" 31L, 634C written



<bldc:/home/tingbinz/apue.2e/include/10>R*_*G:./10_2
in signal handler
uname:root
Alarm Clock

Linux:切换当前进程的权限 一、函数 用于切换ji int getpwnam_r(const char *name, struct passwd *pwd, char *buffer, size_t bufsize, struct passwd **result); int setgid(gid_t gid); int setgid(gid_t gid); 阅读详情

相关推荐

系统数据文件和信息

文章目录/etc/passwdgetpwuid()的实现/etc/group/etc/shadow /etc/passwd NAME getpwnam, getpwnam_r, getpwuid, getpwuid_r - get password file entry SYNOPSIS #include <sys/types.h> #include <pwd.h> struct passwd *getpwnam(const

Daisy_G_Jasmine的博客 393

信号处理函数的编写规则

具体的与Linux信号相关的知识,可以参考我另外一篇博客:Linux信号博客 这里只讨论关于编写安全的信号处理函数主要有以下一些规则: 信号处理函数尽量只执行简单的操作,譬如只是设置一个外部变量,其它复杂的操作留在信号处理函数之外执行; errno 是线程安全,即每个线程有自己的 errno,但不是异步信号安全。如果信号处理函数比较复杂,且调用了可能会改变 errno 值的库函数,必须考虑在信号...

你又来看我了,一起学习吧 1535

( standard c libraries translation )getpwnam

getpwnam, getpwnam_r, getpwuid, getpwuid_r - get password file entry getpwnam, getpwnam_r, getpwuid, getpwuid_r - 获取password文件的入口 所需头文件 #include #include struct passwd *getpwnam(const char

1299

NSS环境下getpwnam_r总是返回NULL的问题(busybox的login.c)

用了6个小时解决这个问题. 下面是busybox的login.c的code: pw = NULL; getpwnam_r(username, &pwdstruct, pwdbuf, sizeof(pwdbuf), &pw); if (!pw) goto auth_failed; getpwnam_r()总是返回NULL, 换成getpwnam()也是一样的。 但是自己类似busy...

fanrey123的博客 1245

信号处理函数调用非可重入函数getpwnam

因为main函数信号处理函数中都调用getpwnam函数,而在getpwnam函数中会调用malloc和free,如果主函数malloc之后收到SIGALRM信号进入信号处理函数,在信号处理函数里malloc然后free,而在信号处理函数调用free和main函数也在调用free时,malloc和free维护的数据结构就出现了损坏。 所以在信号处理函数调用非可重入函数,则其结果不可预知的。

hellochenlu的博客 1066

apue第三版 在信号处理程序中调用不可再入函数 的例子遇到的问题

记录一下在10.6 可重入函数 这一节,输入书上的例子时遇到的一些错误 我是使用的linux 2.6的系统运行的代码,发生了几个错误困扰了我好久。 代码如下: #include #include static void my_alarm(int signo) {     struct passwd *rootptr;          printf("in signa

皓月的博客 817

重入不可重入

重入一般可以理解为一个函数在同时多次调用,例如操作系统在进程调度过程中,或者单片机、处理器等的中断的时候会发生重入的现象。 一般浮点运算都是由专门的硬件来完成,举个例子假设有个硬件寄存器名字叫做FLOAT,用来计算和存放浮点数的中间运算结果 假设有这么个函数 void fun() { //...这个函数对FLOAT寄存器进行操作 } 假如第一次执行,有个对浮点数操作运算的结果临时存在FLOAT寄存

逐波与逆流 811

unix 环境高级编程 信号二 可重入函数不可重入函数

b

crazy_programmer_p的专栏 820

10.6 可重入函数

当一个信号捕获到并开始被进程处理的时候,进程正常执行的指令序列将被信号处理函数临时中断,进程立即转到信号处理函数中开始执行,如果信号处理函数返回(而不是调用exit或者是longjmp等),然后在进入信号处理函数之前进程正在执行的指令序列将会接着执行,但是在信号处理函数中,我们无法获知在信号被捕获的时候进程正在执行那一段代码,如果进程正在使用函数malloc在其堆上分配额外的内存的过程中...

Alice816102的博客 202

重入函数reentrant function

在哪些情况下是需要考虑函数的可重入性的1. 进程捕捉信号并对其进行处理时进程捕获到信号并对其进行处理时,进程正在执行的正常指令序列就被信号处理程序临时中断,它首先执行该信号处理程序中的指令。如果从信号处理程序返回(即在信号处理函数中没有调用exit或longjump),则继续执行在捕获到信号时进程正在执行的正常指令序列(这类似于发生硬件中断时所做的)。 但是在信号处理程序中,不能够判断捕捉到信号

u013793383的专栏 1354

10_5 在信号处理函数调用非可重入函数getpwnam

因为main函数信号处理函数中都调用getpwnam函数,而在getpwnam函数中会调用malloc和free,如果主函数malloc之后收到SIGALRM信号进入信号处理函数,在信号处理函数里malloc然后free,而在信号处理函数调用free和main函数也在调用free时,malloc和free维护的数据结构就出现了损坏。 所以在信号处理函数调用非可重入函数,则其结果不可预知的。

YOU CAN IF YOU BELIEVE YOU CAN 520

Java重入函数_可重入函数列表

10.6. Reentrant FunctionsWhen a signal that is being caught is handled by a process, the normal sequence of instructions being executed by the process is temporarily interrupted by the signal handler....

weixin_39600400的博客 198

不可重入函数getpwnam的问题

getpwnam()   函数功能:获取用户登陆相关信息 #include #include #include #include #include void sig_handler(int signo); int main(int argc, c

sgling0440的专栏 955

getpwnam函数学习

来个百度的复制粘贴 getpwnam   getpwnam()  函数功能:获取用户登录相关信息    原型定义: struct passwd *getpwnam(const char *name);  表头文件:  #include   #include   信息存贮在如下的结构体之中  struct passwd {  char * pw_name; /* Username. */  

liujianfei526的专栏 1396

信号之可重入函数

进程捕捉到信号并对其进行处理时,进程正在执行的指令序列就被信号处理程序临时中断,它首先执行该信号处理程序中的指令。如果从信号处理程序返回(例如信号处理程序没有调用exit或longjmp),则继续执行在捕捉到信号时进程正在执行的正常指令序列。但在信号处理程序中,不能判断捕捉到信号时进程在何处执行。如果程序正在执行malloc,在其堆中分配另外的存储空间,而此时由于捕捉到信号而插入执行该信号处理程...

weixin_30786617的博客 66
上一篇: SUID和SGID的详细解析
下一篇: Unix Ware平台上SIGCLD重复发送解决办法
ciky2011
博客等级 码龄15年 70粉丝 122原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值