1、atexit()函数
函数名: atexit
头文件:#include<stdlib.h>
功能: 注册终止函数(即main执行结束后调用的函数)
用法: int atexit(void (*func)(void));
注意:一个进程可以登记32个函数,这些函数由exit自动调用,这些函数被称为终止处理函数,atexit函数可以登记这些函数。 exit调用终止处理函数的顺序和atexit登记的顺序相反,如果一个函数被多次登记,也会被多次调用。
程序例:
由此结果可知:注册函数的顺序与调用函数的顺序相反
进程的终止方式:
有8种方式使进程终止,其中前5种为正常终止,后三种为异常终止。
1:从 main 返回
2:调用 exit
3:调用 _exit 或 _Exit
4:最后一个线程从其启动例程返回
5:最后一个线程调用 pthread_exit
6:调用 abort
7:接到一个信号并终止
8:最后一个线程对取消请求做出响应
2、除了r,w,x之外的权限位
文件权限除了r、w、x外还有s、t、i、a权限:
s:文件属主和组设置SUID和GUID,文件在被设置了s权限后将以root身份执行。在设置s权限时文件属主、属组必须先设置相应的x权限,否则s权限并不能正真生效(c h m o d命令不进行必要的完整性检查,即使不设置x权限就设置s权限,chmod也不会报错,当我们ls -l时看到rwS,大写S说明s权限未生效)。Linux修改密码的passwd便是个设置了SUID的程序,普通用户无读写/etc/shadow文件的权限确可以修改自己的密码。
ls -al/usr/bin/passwd
-rwsr-xr-x 1root root 32988 2008-12-08 17:17 /usr/bin/passwd
我们可以通过字符模式设置s权限:chmod a+sfilename,也可以使用绝对模式进行设置:
suid (chmod u+s file)只能应用在可执行文件上,允许任意用户在执行文件时以文件拥有者的身份执⾏
t :设置粘着位,一个文件可读写的用户并一定相让他有删除此文件的权限,如果文件设置了t权限则只用属主和root有删除文件的权限,通过chmod +t filename 来设置t权限。
他只针对目录生效,它表示只能让所属主以及root可以删除(重命名/移动)该目录下的文件。比如/tmp目录本来就是任何用户都可以读写,如果别人可以任意删除(重命名/移动)自己的文件,那岂不是很危险,所以这个t权限就是为了解决这个问题。
测试:
先在root用户下建立一个临时目录文件。给之加权限t。
返回普通用户,并在tmp中新建test文件,发现权限不够。只有在root权限下才可对此文件进行删除,移动等操作。
i:不可修改权限 例:chattr u+i filename则filename文件就不可修改,无论任何人,如果需要修改需要先删除i权限,用chattr -i filename就可以了。查看文件是否设置了i权限用lsattr filename。
a:只追加权限, 对于日志系统很好用,这个权限让目标文件只能追加,不能删除,而且不能通过编辑器追加。可以使用chattr +a设置追加权限。