C 移植代码:Linux中是否有与utssys()等效的API?我需要将utssys()unix API移植到Linux环境?

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

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 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;
}