进 程 凭 证

#define _GNU_SOURCE
#include<unistd.h>
#include<sys/fsuid.h>
#include<limits.h>
#include<stdio.h>
#include<pwd.h>
#include<grp.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
#include"ugid_functions.h"

#define SG_SIZE (NGROUPS_MAX + 1)

/*
struct passwd
{
     char *pw_name;     //登录名
     char *pw_passwd;   //用户密码
     uid_t pw_uid;      //用户id
     uid_t pw_gid;      //用户组id
     char *pw_gecos;    //用户描述
     char *pw_dir;      //用户家目录
     char *pw_shell;    //用户登录shell
};
*/

/*
struct group
{
  char *gr_name;  				 组名 
  char *gr_passwd;  			 密码 
  __gid_t gr_gid;  				 组ID 
  char **gr_mem;  			组成员名单 
}
*/

//userNameFromId 根据用户ID获取登录名
char *userNameFromId(__uid_t uid)
{
    struct passwd *pwd;

    //getpwuid 根据传入的用户ID返回指向passwd的结构体 该结构体初始化了里面的所有成员
    pwd = getpwuid(uid);
    return (pwd == NULL) ? NULL : pwd->pw_name;
}

//userIdFromName 根据登录名获取登录ID
__uid_t userIdFromName(const char *name)
{
    struct passwd *pwd;
    __uid_t u;
    char *endptr;

    if(name == NULL || *name == '\0')
        return -1;

    // strtol () 函数用来将 字符串 转换为 长整型数 (long)
    u = strtol(name,&endptr,10);

    if(*endptr == '\0')
        return u;
    pwd = getpwnam(name);
    if(pwd == NULL)
        return -1;
    return pwd->pw_uid;
}

//通过组ID获取组名
char *groupNameFromId(__gid_t gid)
{
    struct group *grp;
    //getgrgid通过组名查找属组信息返回group结构
    grp = getgrgid(gid);
    return (grp == NULL) ? NULL : grp->gr_name;
}
//通过组名获取组ID
__gid_t grooupIdFromName(const char *name)
{
    struct group *grp;
    __gid_t g;
    char *endptr;

    if(name == NULL || *name == '\0')
        return -1;
    g = strtol(name,&endptr,10);
    if(*endptr == '\0')
        return g;
    grp = getgrnam(name);
    if(grp == NULL)
       return -1;
    return grp->gr_gid;
}


int main(int argc,char *argv[])
{
    uid_t ruid,euid,suid,fsuid;
    gid_t rgid,egid,sgid,fsgid;
    gid_t suppGroups[SG_SIZE];
    int numGroups,j;
    char *p;

    //getresuid()系统调用将调用进程的当前实际用户 ID、有效用户 ID 和保存 
    //set-user-ID 值返 回至给定 3 个参数所指定的位置
    if(getresuid(&ruid,&euid,&suid) == -1)
    {
        printf("getresuid获取ID失败\n");
        return -1;
    }

    //getresgid()系统调用针对相应的组 ID 实现了类似getresuid()功能。
    if(getresgid(&rgid,&egid,&sgid) == -1)
    {
        printf("getresgid获取失败\n");
        return -1;
    }
    //setfsuid()系统调用将进程文件系统用户 ID 修改为参数 fsuid 所指定的值
    fsuid = setfsuid(0);
    //setfsgid()系统调用将文件系统组 ID 修改为参数 fsgid 所指定的值
    fsgid = setfsgid(0);

    printf("UID:");
    p = userNameFromId(ruid);
    printf("real=%s(%ld);",(p == NULL) ? "???" : p,(long)ruid);
    p = userNameFromId(euid);
    printf("eff=%s(%ld);",(p == NULL) ? "???" : p,(long)euid);
    p = userNameFromId(suid);
    printf("saved=%s(%ld);",(p == NULL) ? "???" : p,(long)suid);
    p = userNameFromId(fsuid);
    printf("fs=%s(%ld);",(p == NULL) ? "???" : p,(long)fsuid);
    printf("\n");

    printf("GID:");
    p = groupNameFromId(rgid);
    printf("real=%s(%ld);",(p == NULL) ? "???" : p,(long) rgid);
    p = groupNameFromId(egid);
    printf("real=%s(%ld);",(p == NULL) ? "???" : p,(long) egid);
    p = groupNameFromId(fsgid);
    printf("real=%s(%ld);",(p == NULL) ? "???" : p,(long) fsgid);
    printf("\n");
    /*
    getgroups()仅返回调用进程的辅助组 ID。然而,
    SUSv3 规范还允许 UNIX 实现在返回的 grouplist 中包含调用进程的有效组 ID。
    调用程序必须负责为 grouplist 数组分配存储空间,并在 gidsetsize 参数中指定其长度。若
    调用成功,getgroups()会返回置于 grouplist 中的组 ID 数量。
    若进程属组的数量超出 gidsetsize,则 getgroups()将返回错误(错误号为 EINVAL)。
    */

    numGroups = getgroups(SG_SIZE,suppGroups);
    if(numGroups == -1)
    {
        return -1;
    }
    printf("supplementary groups(%d):",numGroups);
    for(j = 0;j < numGroups;j++)
    {
        p = groupNameFromId(suppGroups[j]);
        printf("%s(%ld)",(p == NULL) ? "???" : p,(long)suppGroups[j]);
    }
    printf("\n");

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
玉软件NC串联式是一种机器人应用技术,用于实现多个机器人之间协同操作和任务分配。它的主要目的是优化生产过,提高生产效率和品质。 NC串联式通过将多个机器人相互连接,使它们能够在同一工作站上协同完成一系列任务。这种方式可以充分利用每个机器人的特长,提高整体生产效率。例如,在生产线上,一个机器人可以完成零件的搬运,而另一个机器人可以完成零件的加工。通过串联式,这两个机器人可以实现无缝衔接,从而提高加工效率。 另外,玉软件NC串联式还可以实现任务的分配和自动化调度。生产过中,不同的任务需要不同的机器人来完成。通过串联式,可以实现自动化的任务分配,将每个任务分配给最适合的机器人。这样可以减少人工干预,提高生产效率和准确性。 值得一提的是,玉软件NC串联式还具有灵活性和可扩展性。在生产过中,如果需要增加或减少机器人数量,只需简单地修改式即可实现。这种灵活性可以根据生产需求行调整,提高生产线的适应性。 总之,玉软件NC串联式是一种基于机器协同的生产优化技术,通过连接多个机器人实现任务的协同和分配,提高生产效率和品质,并具备灵活性和可扩展性。这种技术应用将为制造业带来更高的效益和竞争优势。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值