2012-09-30 83 views
1

我寫了一個簡單的程序,在用戶名上調用getpwnam(),將該用戶名傳遞給函數,然後再次調用getpwnam()。出於某種原因,我總是在函數內部獲取root的passwd信息。爲什麼getpwnam()總是返回函數中的根信息?

#include <sys/types.h> 
#include <pwd.h> 
#include <stdio.h> 

void printuser(char *username) { 
    printf("USERNAME2: %s\n", username); 
    struct passwd *user_info = getpwnam(username); 
    printf("USERNAME3: %s\n", username); 
    printf("USERNAME4: %s\n", user_info->pw_name); 
} 

int main(int argc, char *argv[]) { 
    struct passwd *user_info = getpwnam(argv[1]); 
    printf("USERNAME1: %s\n", user_info->pw_name); 
    printuser(user_info->pw_name); 
    printf("USERNAME5: %s\n", user_info->pw_name); 
} 

程序會產生以下輸出:

$ ./test_getpwnam chenxiaolong 
USERNAME1: chenxiaolong 
USERNAME2: chenxiaolong 
USERNAME3: root 
USERNAME4: root 
USERNAME5: root 

我無法找到與此相關的手冊頁什麼。有什麼我做錯了嗎?

在此先感謝!

回答

3

返回值可能指向由後續調用getpwent(),getpwnam()或getpwuid()所覆蓋的靜態區域。

http://pubs.opengroup.org/onlinepubs/9699919799/functions/getpwnam.html

特別是,沒有關於讀取/寫入順序保證,所以它不是安全地傳遞數據從​​返回到​​。

你根本不應該使用​​;改爲使用getpwnam_r

+0

非常感謝!我應該更仔細地閱讀手冊頁:) –

相關問題