2009-07-31 82 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