setuid和getuid似乎不工作

我正在写一个访问Linux原始套接字的Qt应用程序,所以我需要root权限来运行程序。 所以我这样做了:

在我的程序中,我在开始时是这样的:

if (getuid() != 0) { fprintf(stderr, "You must be root to run this program. UID = %i\n", getuid()); exit(-1); } 

然后,我做了“chmod 6777 myProgram”作为根。

但是,当我试图以普通用户身份运行它时,它说:“您必须是root用户才能运行此程序。UID = 1002”,其中1002是我当前正在使用的用户ID。

任何一个人可以发表一条线索吗?

谢谢

你正在混合getuid()geteuid() 。 从getuid()的手册页:

getuid()函数返回调用进程的真实用户标识。 geteuid()函数返回调用进程的有效用户标识。

真正的用户ID是调用程序的用户的ID。 由于有效用户ID在执行set-user-ID模式进程期间为进程提供额外权限,因此使用getuid()来确定调用进程的真实用户id。

Linux的手册页更加简洁(前一个来自Mac OS X):

当正常程序执行时,进程的有效和真实用户ID被设置为执行该文件的用户的ID。 当执行一组ID程序时,真实用户ID被设置给主叫用户,有效用户ID对应于正在执行的文件上的设置ID位。

对于setuid程序,文件需要由您想要设置的用户标识拥有,这在大多数情况下是root用户。