getrlimit

cpu時間のリミットを取得

#include < sys/time.h >
#include < sys/resource.h >

#include 

int main(){
    struct rlimit rlim;
    
    if (getrlimit(RLIMIT_CPU, &rlim) < 0){
        perror("getrlimit");
        return 1;
    }
    
    if (rlim.rlim_cur == RLIM_INFINITY){
        printf("rlim_cur = unlimited\n");
    } else {
        printf("rlim_cur = %lld\n", (long long)rlim.rlim_cur);
    }
    
    if(rlim.rlim_max == RLIM_INFINITY){
        printf("rlim_max = unlimited\n");
    } else {
        printf("rlim_max = %lld\n", (long long)rlim.rlim_max);
    }
    return 0;
}

getrusage

#include < sys/time.h >
#include < sys/resource.h >

#include < unistd.h >
#include < stdio.h >

int main(){
    struct rusage usage;
    int i; j;
    
    j = 1;
    for (i = 1; i <= 1000000; i++){
        chdir(".");
        j *= i;
    }
    if (getrusage(RUSAGE_SELF, &usage) < 0){
        perror("getrusage");
        return 1;
    }
    
    printf(
    "user time =  %ld.%06ld\n"
           "system time = %ld.%06ld\n",
           usage.ru_utime.tv_sec, usage.ru_utime.tv_usec,
           usage.ru_stime.tv_sec, usage.ru_stime.tv_usec
           );
    return 0;
}

getgroups

#include < sys/types.h >
#include < unistd.h >
#include < grp.h >

#include 

int main(){
    gid_t list[3];
    
    list[0] = 3000;
    list[1] = 3001;
    list[2] = 3002;
    if (setgroups(3, list) < 0){
        perror("setgroups");
        return 1;
    }
    return 0;
}

getgroups

#include < sys/types.h >
#include < unistd.h >

#include < limits.h >
#include < stdio.h >

int main()
{
    int i;
    int groups;
    gid_t list[NGROUPS_MAX];
    
    if((groups = getgroups(NGROUPS_MAX, list))< 0){
        perror("getgroups");
        return 1;
    }
    
    for (i = 0; i < groups; i++){
        printf("%d", (int)list[i]);
    }
    putchar('\n');
    return 0;
}

setid

forkした後に親プロセス側は終了し、子プロセスがsetidを実行して、新しいセッションを作成。

#include 

#include 
#include 

int main()
{
    pid_t pid;
    
    if ((pid = fork()) < 0){
        perror("fork");
        return 1;
    } else if(pid > 0){
        _exit(0);
    }
    
    if (setsid() < 0){
        perror("setsid");
        return 1;
    }
    
    return 0;
}

setpgid

引数pid、引数pgidの両方にゼロを指定

#include < unistd.h >

#include < stdio.h >

int main()
{
    if (setpgid(0, 0) < 0){
        perror("setpgid");
        return 1;
    }
    return 0;
}

getpgid

自分自身のプロセスループIDを取得し、それを表示

#define _XOPEN_SOURCE 500
#include < unistd.h >

#include < stdio.h >

int main()
{
    pid_t pgid;
    
    if ((pgid = getpgid(0)) < 0){
        perror("getpgid");
        return 1;
    }
    printf("pgid = %d\n", (int)pgid);
    return 0;
}

seteuid

#include < sys/types.h >
#include < unistd.h >

#include < stdio.h >

static void
printuid()
{
    printf("uid = %d euid = %d\n",
           (int)getuid(), (int)geteuid());
}

int main() {
    uid_t uid, euid;
    
    uid = getuid();
    euid = geteuid();
    
    printuid();
    
    if (seteuid(uid) < 0){
        perror("seteuid");
        return 1;
    }
    printuid();
    
    if (seteuid(euid)<0){
        perror("seteuid");
        return 1;
    }
    printuid();
    
    return 0;
}

uid, euidの設定

#include < sys/types.h >
#include < unistd.h >

#include < stdio.h >

static void
printuid()
{
    printf("uid = %d euid = %d\n",
           (int)getuid(),(int)geteuid());
}

int main() {
    uid_t uid, euid;
    
    uid = getuid();
    euid=geteuid();
    
    printuid();
    
    if(setuid(uid) < 0){
        perror("setuid");
        return 1;
    }
    printuid();
    
    if(setuid(euid) < 0){
        perror("setuid");
        return 1;
    }
    printuid();
    
    return 0;
}