C 移植代码:Linux中是否有与utssys()等效的API?我需要将utssys()unix API移植到Linux环境?
unix中的utssys()提供文件上的用户总数。它是一个未记录的API,Solaris手册页和Linux手册页中都没有手动输入此API。Linux中是否有任何等效的API,或者我也可以在Linux中使用相同的API(我不知道它是未记录的)。我也在谷歌上搜索过,但没有得到任何这样的信息。请帮忙C 移植代码:Linux中是否有与utssys()等效的API?我需要将utssys()unix API移植到Linux环境?,c,C,unix中的utssys()提供文件上的用户总数。它是一个未记录的API,Solaris手册页和Linux手册页中都没有手动输入此API。Linux中是否有任何等效的API,或者我也可以在Linux中使用相同的API(我不知道它是未记录的)。我也在谷歌上搜索过,但没有得到任何这样的信息。请帮忙 int DU_Utssys_Unix(void* buf, int arg, int type, void* out) { int result; // Perform syste
int DU_Utssys_Unix(void* buf, int arg, int type, void* out)
{
int result;
// Perform system-call
errno = 0;
if ((result = utssys(buf, arg, type, out)) < 0)
return result;
// Look into the result:
return ((fu_data_t*)outbp)->fud_user_count;
}
我认为Linux中没有系统调用来实现这一点,但作为root用户,您可以执行以下操作:
- 统计获取
和st_dev
值的文件st_ino
- 浏览
,并针对每个条目:/proc/*/fd/*
- 如果
和st_dev
匹配,则增加计数st_ino
{
DIR*pDir;
结构方向*dEntry;
int-retCode=0;
int-dirPattern;
pDir=opendir(“.”);
if(!pDir)
{
返回-1;
}
而((dEntry=readdir(pDir))!=NULL)
{
如果(!strcmp(dEntry->d_name,“.”)| |!strcmp(dEntry->d_name,“…”))
{
持续
}
dirPattern=strtol(dEntry->d_name,NULL,10);
if(errno==ERANGE | | dirPattern==0)
{
持续
}
如果(chdir(dEntry->d_name)<0)
{
持续
}
retCode=scan\u pid\u dir(“fd”,fileData,pCount);
如果(重新编码)
{
返回-1;
}
chdir(“/proc”);
}
closedir(pDir);
返回0;
}
您对调用内容的描述与@NPE有很大不同。Linux中是否存在用于此目的的API?的使用不止一种。在这种情况下,OP应该请求一个相当于“文件的用户数”的系统调用。请查看我更改的查询。我只是添加了代码片段来了解它。基本上它返回文件的用户数。@melpomen目的是在Linux中获取文件的用户数。以上是Unix中用于相同目的的代码和结构。请给出一些在Linux中执行此操作的指针。我们可以使用syscall()来处理它吗?但似乎很难将它们用于实现。我们不能使用syscall()吗?如何使用?你能了解f_用户和fu_数据结构吗?我是说,我们可以在Linux中也使用这些吗?或者我们需要找到其他方法?在Linux中没有这样的系统调用。此结构是专门为实现此功能而创建的。在Solaris内核中没有其他东西使用它。我可以解释这些结构以及它们的作用,但是没有任何意义,因为对于这个函数来说,它完全没有用,因为它只使用列表的长度作为返回码,即文件的用户数。我为您提供了一个在linux下模拟它的合理算法。
typedef struct f_user
{
int fu_flags; /* see below */
union
{
struct
{
pid_t u_pid;
uid_t u_uid;
}u_info;
struct
{
int k_modid;
int k_instance;
int k_minor;
}k_info;
} fu_info;
}f_user_t;
typedef struct fu_data
{
int fud_user_max;
int fud_user_count;
struct f_user fud_user[1];
}fu_data_t;
{
DIR* pDir;
struct dirent* dEntry;
int retCode = 0;
int dirPattern;
pDir = opendir(".");
if (!pDir)
{
return -1;
}
while ((dEntry = readdir(pDir)) != NULL)
{
if (!strcmp(dEntry->d_name, ".") || !strcmp(dEntry->d_name, ".."))
{
continue;
}
dirPattern = strtol(dEntry->d_name, NULL, 10);
if (errno == ERANGE || dirPattern == 0)
{
continue;
}
if (chdir(dEntry->d_name) < 0)
{
continue;
}
retCode = scan_pid_dir("fd", fileData, pCount);
if(retCode)
{
return -1;
}
chdir("/proc");
}
closedir(pDir);
return 0;
}