在Linux下,某些涉及到底层或系统级操作的程序,如tcpdump、wireshark等,我们不得不以root(高级用户)权限运行方能正常工作,我们在设计居如此类的程序时,能否在程序内部判断程序自身是否以root(高级用户)权限运行,以便于提示用户切换到高级权限下运行呢?答案是肯定的。
Linux下的程序运行时,是有用户概念的,在不同的用户环境下运行同一个程序,程序对应的运行信息内有用户ID这一项,凡是root用户,调用进程的实际用户ID跟有效用户ID都为0,而如果是非root用户,则实际用户ID或有效用户ID都是从1000开始的某个值,作为除了root用户外,系统第一个创建的用户,其ID是1000,随后创建的用户,其ID依次累加。所以,我们可以通过获取调用进程的实际用户ID或者有效用户ID来判断该进程是否以root(高级用户)权限运行。
在Linux下,我们使用getuid来获取调用进程的实际用户ID,用geteuid来获取调用进程的有效用户ID。有效用户ID(EUID)是你最初执行程序时所用的ID,表示该ID是程序的所有者,真实用户ID(UID)是程序执行过程中采用的ID,该ID表明当前运行位置程序的执行者。我们当然要获取程序最初启动时候的用的ID,即有效用户ID(EUID),所以调用geteuid。
if (geteuid() != 0) { fprintf(stderr, "This program must run as root\n"); exit(1); }
除非注明,文章均为CppLive 编程在线原创,转载请注明出处,谢谢。