2013-05-28 26 views
0

我有一个关于C中的shmget()函数的简单问题。该程序非常简单。它要求用户输入一个shmid,并把它放出密钥,模式,所有者等。在C中的shmget()函数的权限

我正在使用buffer->shm_perm.mode获得权限,但它以八进制形式(960等)提供权限。有什么办法可以改变它,所以它显示像“rwx”的权限?

感谢

+2

你必须编写代码;这并不是那么困难,但是没有一个众所周知的标准功能可以为你做到。 –

+3

我*希望*八进制不会给你一个数字'9'!可能是十六进制? – dmckee

+0

@Jonathan Leffler,我有整个程序的编写和工作。我只想改变上面的行,所以它给了我“rwx”而不是960的许可。权限是正确的,但我需要更改合成。 – Neo

回答

2

A(非重入)函数将mode_t值转换可能是由ls生成的字符串:

/* 
** Convert a mode field into "ls -l" type perms field. 
*/ 
static char *lsperms(int mode) 
{ 
    static char *rwx[] = {"---", "--x", "-w-", "-wx", 
    "r--", "r-x", "rw-", "rwx"}; 
    static char bits[11]; 

    bits[0] = filetypeletter(mode); 
    strcpy(&bits[1], rwx[(mode >> 6) & 7]); 
    strcpy(&bits[4], rwx[(mode >> 3) & 7]); 
    strcpy(&bits[7], rwx[(mode & 7)]); 
    if (mode & S_ISUID) 
     bits[3] = (mode & 0100) ? 's' : 'S'; 
    if (mode & S_ISGID) 
     bits[6] = (mode & 0010) ? 's' : 'l'; 
    if (mode & S_ISVTX) 
     bits[9] = (mode & 0001) ? 't' : 'T'; 
    bits[10] = '\0'; 
    return(bits); 
} 

这可以简化共享内存,因为你不知道需要文件类型(反正这里没有提供的功能)或特殊权限位。

/* 
** Convert a mode field into "ls -l" type shared memory perms field. 
*/ 
static char *shmperms(int mode) 
{ 
    static char *rwx[] = {"---", "--x", "-w-", "-wx", 
    "r--", "r-x", "rw-", "rwx"}; 
    static char bits[10]; 

    strcpy(&bits[0], rwx[(mode >> 6) & 7]); 
    strcpy(&bits[3], rwx[(mode >> 3) & 7]); 
    strcpy(&bits[6], rwx[(mode & 7)]); 
    bits[9] = '\0'; 
    return(bits); 
} 
+0

由于代码使用'strcpy()',空终止符的分配严格冗余。 –