2009-07-31 80 views
0

我对C完全陌生,我很少使用它。这次我需要一个大学项目。我必须编写一个小的c应用程序来测试我们在Linux内核(在调度程序上)所做的一些修改。seteuid()不起作用。原因?

在脚本内部,我想切换到另一个用户,以查看不同用户中CPU时间的分布情况。所以我用root权限启动我的小C程序(即使用sudo ./myapp)。编程内部 - 在我执行了一些需要root权限的操作之后 - 我想通过调用seteuid(1000)或setuid(1000)来切换回另一个uid,其中1000是现有用户的标识(我用来登录上)。然而这个调用似乎没有任何效果,它也不会抛出任何异常。 这里是我写的一个样本,只是为了测试UID开关:

#define _POSIX_SOURCE 
#include <pwd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sched.h> 
#include <unistd.h> 
#include <string> 
#include <time.h> 

using namespace std; 


int main(int argc, char *argv[]) 
{ 
    int uid; 
    struct passwd *p; 

    if ((p = getpwuid(uid = getuid())) == NULL){ 
      perror("getpwuid() error"); 
      exit(1); 
    } 

    printf("***************************************\n"); 
    printf("Executing user: %s (%d)\n", p->pw_name, p->pw_uid); 
    printf("***************************************\n"); 

    seteuid(1000); 

    if ((p = getpwuid(uid = getuid())) == NULL){ 
      perror("getpwuid() error"); 
      exit(1); 
    } 

    printf("***************************************\n"); 
    printf("Executing user: %s (%d)\n", p->pw_name, p->pw_uid); 
    printf("***************************************\n"); 

    return 0; 
} 

有谁知道为什么它不会工作?任何帮助,高度赞赏! THX

//编辑: 由CHSH

回答

3

提到我认为这是工作得很好,因为有你在拍摄的getuid的价值在代码的逻辑只是一个问题的修正码()成passwd结构,然后在调用seteuid()之后仅显示两次而不再检索它。

+0

+1 - 是的,你需要重新执行`p = getpwuid()`调用。 – 2009-07-31 12:53:35