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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

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

所以在信号处理函数中调用非可重入函数,则其结果是不可预知的。

#include "apue.h"
#include <pwd.h>
#include "error.h"

static void my_alarm(int signo)
{
        struct passwd *rootptr;

        printf("in signal handler\n");
        if ((rootptr = getpwnam("root")) == NULL)
        {
                err_sys("getpwnam(root) error");
        }
        alarm(1);
}

int main(void)
{
        struct passwd *ptr;

        signal(SIGALRM, my_alarm);
        alarm(1);
        for ( ; ; )
        {
                if ((ptr = getpwnam("sebastien")) == NULL)
                {
                        err_sys("getpwnam error");
                }
                if (strcmp(ptr->pw_name, "sebastien") != 0)
                {
                        printf("return value corrupted!, pw_name = %s\n", ptr->pw_name);
                }
        }
}


编写名为strdup的函数 编写名为strdup的函数,此函数使用动态存储分配来产生字符串的副本。例如调用 • p= strdup(str); • 将为和str相同的字符串分配空间,并且把字符串str的内容 复制给新字符串,然后返回指向新字符串的指针,如果配 失败则返回空指针。 立即下载

相关推荐

Linux 多线程应用中如何编写安全的信号处理函数

Linux 多线程应用中如何编写安全的信号处理函数

getpwnam()函数:从密码文件中取得指定账号的数据

1,头文件: #include <pwd.h> #include <sys/types.h> 2,函数定义: struct passwd * getpwnam(const char * name); 3,函数说明: getpwnam()用来逐一搜索参数name 指定的账号名称, 找到时便将该用户的数据以passwd 结构返回。passwd 结构请参考getpwent() 4,返回值: 返回 passwd 结构数据, 如果返回NULL 则表示已无数据, 或有错误发生. 5

lj19990824的博客 2700

10.6 可重入函数

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

Alice816102的博客 202

linux getpwnam

linux getpwnam

xiaozhi 627

Linux 常用C函数(用户组篇2)

Linux 常用C函数(用户组篇2)2007-03-22 11:40  

qipnx的专栏 735

Linux下获取用户名getuid,geteuid,getpwnam,getpwuid,getpwnam_r,getpwuid_r

在Linux编程中,有时需要我们获取用户的信息,包括用户名,用户Id,用户目录等信息,本篇记录获取用户名相关信息的函数的使用getuid(), geteuid(), getpwnam(), getpwuid(), getpwnam_r(), getpwuid_r()。

chenyijun的专栏 9014

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

可重入函数reentrant function

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

u013793383的专栏 1354

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

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

皓月的博客 817

Reentrant Functions可重入函数

10.6 Reentrant Functions可重入函数 (翻译by linxuleio)    当一个进程捕捉到信号,进程执行的正常指令流程被signal handler(自定义的信号处理函数)临时打断。这时进程转而执行signal handler里的指令。当sign

fertiland的专栏 1750

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

b

crazy_programmer_p的专栏 820

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

可重入和不可重入

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

逐波与逆流 811

APUE学习笔记-可重入函数

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34203426的博客 153

getpwnam函数学习

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

liujianfei526的专栏 1396

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

R*_*G:vim 10_2.c #include "apue.h" #include static void my_alarm(int signo) {         struct passwd *rootptr;         printf("in signal handler\n");         if((rootptr = getpwnam("roo

YOU CAN IF YOU BELIEVE YOU CAN 445

Linux 可重入、异步信号安全和线程安全

可重入函数:重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static ),这样的函数就是purecode (纯代码)可重入,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰。如果信号处理函数中的操作与打断的函数的操作相同,而且这个操作中有静态数据结构等,当信号处理函数返回的时候(当然这里讨论的是信号处理函数可以返回),恢复原先的执行序列,可能会导致信号处理函数中的操作覆盖了之前正常操作中的数据。

qq_43416206的博客 213

可重入函数getpwnam的问题

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

sgling0440的专栏 955

信号之可重入函数

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

weixin_30786617的博客 66
上一篇: vim 复制、删除多行
下一篇: setjmp和longjmp函数使用详解
hellochenlu
博客等级 码龄14年 97粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值