我使用以下代码作为参考来获取Solaris 11.2计算机的卷列表:
#include <time.h>
#include <sys/mntent.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/vfs.h>
#include <errno.h>
struct mntent
{
char *mnt_fsname; /* Device or server for filesystem. */
char *mnt_dir; /* Directory mounted on. */
char *mnt_type; /* Type of filesystem: ufs, nfs, etc. */
char *mnt_opts; /* Comma-separated options for fs. */
int mnt_freq; /* Dump frequency (in days). */
int mnt_passno; /* Pass number for `fsck'. */
};
char ** getVolumeList(int * size)
{
char ** volList = NULL;
int listLen = 0;
char tmp[1024];
struct mntent* vp ;
FILE *fp=fopen("/etc/mnttab", "r");
int result;
printf("in getVolumeList\n");
printf("coming here 1\n");
volList = (char **) malloc(sizeof(char*) * (*size));
printf("coming here \n");
vp = getmntent(fp);
if (vp == NULL)
printf("vp is null");
result = getmntent(fp,vp);
if(result == -1)
{
printf ("getmntent returned:%d. Hence breaking from loop\n", result);
}
/*
ignore all entries for which mount options is set to ignore
these don't show up in dk -k also although dk -a shows them
*/
if(vp->mnt_dir != NULL)
{
strcpy(tmp,vp->mnt_dir);
volList[listLen] = (char*) malloc(sizeof(char) * (strlen(tmp)+1));
strcpy(volList[listLen], tmp);
listLen++;
}
else
{
printf("\nmountp is NULL \n");
}
printf("freeing vp\n");
if (vp != NULL)
{
free(vp);
}
if (fp != NULL)
{
fclose(fp);
}
*size = listLen;
printf("returning from getVolumeList\n");
return volList;
}
但这似乎引发了以下seg错误:
#0 0xfe663923 in getmntent_compat () from /lib/libc.so.1
我猜这是因为solaris 11.2上的mntent.h没有定义struct mntent或者头文件中有以下方法签名: getmntent(); getmntent(FP,VP)
是否有任何其他等效方法来确定安装在solaris计算机上的卷,或者更好的是一种独立于操作系统的方法来确定当前安装的卷?
P.S。我是C的新手。
答案 0 :(得分:2)
代码中存在一些不同的错误。沿着这些方向的东西可能会起作用:
#include <stdio.h>
#include <mntent.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
/* Return a NULL-terminated list of filesystem mountpoints, or NULL on error.
* The individual strings in the result need to be freed,
* as does the result array.
*/
char **getVolumeList(void)
{
char **res = NULL;
int allocated = 1;
int size = 0;
struct mntent *ent;
FILE *fp = setmntent("/etc/mnttab", "r");
if( !fp ) return NULL;
while( (ent=getmntent(fp)) )
{
if(allocated <= size+1)
{
allocated *= 2;
res = realloc(res, sizeof(char*)*allocated );
if( !res ) return NULL;
}
res[size++] = strdup( ent->mnt_dir );
res[size] = NULL;
}
endmntent(fp);
return res;
}
此函数返回动态大小的空终止数组,该数组至少从代码中删除硬编码限制。
崩溃的实际原因可能是你没有使用正确的方法来打开文件,getmntent()需要一些额外的存储来完成它的工作(与getmntent_r不同,你负责的是创建存储空间)
此外,您不应释放getmntent返回的存储空间,因为它被记录为静态存储。
上面的函数将按以下方式使用:
int main(int argc, char **argv)
{
int i;
char ** list = getVolumeList();
if(!list)
{
fprintf(stderr, "failed to get list\n");
return 1;
}
for(int i=0; list[i]; i++ )
{
fprintf( stdout, "%d: %s\n", i, list[i]; );
free( list[i] );
}
free( list );
}