2016-11-07 15 views
1

まずはmy codeを見てみましょう。getgrnam()をgetgrent()でC言語で使用する方法

#include <stdio.h> 
#include <grp.h> 
#include <pwd.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <string.h> 

int main(int argc, char** argv){ 
    struct group *grp; 
    struct group *tmpGrp; 
    struct passwd *pw; 

    int n; 
    gid_t gid; 

    pw=getpwnam(argv[1]); 
    gid=pw->pw_gid; 

    printf(“%s”,pw->pw_name); 
    printf(“\n”); 
    grp = getgrgid(gid); 
    char *mainGrp = grp->grame; 
    printf(“out : %s\t”, mainGrp); 

    while((tmpGrp=getgrgent())!=NULL){ 
     n=0; 
     printf(“in : %s\t”,mainGrp); 
    } 
    printf(“\n”); 
    return 0; 
} 

、それはようである出力です:getgrnamを使用しているとき、見ての通り

root 
out : root in : root in : other in : bin in : sys .... 

()とのgetgrent()は、同時に、グループ名が文字列で割り当てられていても、変更されました。私は)

root 
out : root in : root in : root in : root .... 

コードルーチンgetgrgent(のようになりたい

はただの後の文字列に割り当てることであるが、なぜこの起こるの?それを修正する方法は?

テストオペレーティングシステム:Solaris 10の

テストコンパイラ:this (Linux) manual page for getgrentからGCC

答えて

2

戻り値は静的な領域を指してもよく、getgrent()に後続の呼び出しによって上書きされてもよいです、getgrgid(3)、またはgetgrnam(3)である。

同じポインタを使用しても、異なる名前になります。これらの関数によって返されるデータは、単一の静的な共有バッファであるためです。

これはまた、the POSIX getgrent reference specificationによって暗示されます。

mainGrpを変更しない場合は、実際の内容をコピーする必要があります。例えば。 mainGrpを配列にしてstrcpyを使用してください。

+0

ありがとうございました! –

関連する問題