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; }
随机应变 ABCD: Always Be Coding and … : хороший
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; }
引数pid、引数pgidの両方にゼロを指定
#include < unistd.h >
#include < stdio.h >
int main()
{
if (setpgid(0, 0) < 0){
perror("setpgid");
return 1;
}
return 0;
}
自分自身のプロセスループ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;
}
#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;
}
#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;
}
getuid/geteuid/getgid/getegidは、それぞれ自分のプロセスの実ユーザID、実行ユーザID、実グループID、実行グループIDを取得します。
#include < unistd.h >
#include < sys/types.h >
#include < stdio.h >
int main()
{
uid_t uid, euid;
gid_t gid, egid;
uid = getuid();
euid = geteuid();
gid = getgid();
egid = getegid();
printf("uid = %d, euid = %d, gid = %d, egid = %d\n",
(int)uid, (int)euid, (int)gid, (int)egid);
return 0;
}
#include < sys/time.h >
#include < sys/resource.h >
#include < errno.h >
#include < stdio.h >
int main(){
int pri;
errno = 0;
pri = getpriority(PRIO_PROCESS, 0);
if (errno != 0){
perror("getpriority");
return 1;
}
printf("%d\n", pri);
return 0;
}
#include < unistd.h >
#include < stdio.h >
#include < stdlib.h >
int main()
{
if (chdir("/tmp")< 0){
perror("chdir");
return 1;
}
system("pwd");
return 0;
}
自分または親のプロセスID
#include < sys/types.h > #include < unistd.h > #includeint main() { pid_t pid, ppid; pid = getpid(); ppid = getppid(); printf("pid = %d, ppid = %d\n", (int)pid, (int)ppid); return 0; }
wait3に引数pidが増えただけです。
#include < sys/types.h >
#include < sys/time.h >
#include < sys/resource.h >
#include < sys/wait.h >
#include < unistd.h >
#include < stdio.h >
int
main()
{
int status;
pid_t pid;
struct rusage usage;
if ((pid = fork()) < 0){
perror("fork");
return 1;
} else if (pid == 0){
write(1, "chlid process\n", 14);
_exit(12);
}
write(1, "parent process\n", 15);
if ((pid = wait4(pid, status, 0, &usage)) < 0){
perror("wait4");
return 1;
}
if(WIFEXITED(status)){
printf(
"pid = %d exited with status = %d\n",
(int)pid, WEXITSTATUS(status));
}
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;
}