获取进程组id
获取pid进程的进程组id 如果pid = 0,那么该函数作用和getpgrp一样
pid_t getpgid(pid_t pid);
获取当前进程的进程组id
pid_t getpgrp(void);
获取进程组id
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include <string.h>
#include <fcntl.h>
#include <signal.h>
// 获取进程组id
int main() {
pid_t pid;
if ((pid = fork()) < 0)
{
perror("fork");
exit(1);
} else if (pid == 0)
{
printf("child pid = %d, ppid = %d, pgid=%d\n", getpid(), getppid(), getpgid(getpid()));
printf("child pid = %d, ppid = %d, pgid=%d\n", getpid(), getppid(), getpgrp());
printf("child pid = %d, ppid = %d, pgid=%d\n", getpid(), getppid(), getpgid(0));
}
printf("parent pid = %d, ppid = %d, pgid=%d\n", getpid(), getppid(), getpgrp());
return 1;
}
设置子进程的进程组id为子进程自己, 父进程的进程组id为父进程的父进程
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include <string.h>
#include <fcntl.h>
#include <signal.h>
// 设置子进程的进程组id为子进程自己, 父进程的进程组id为父进程的父进程
int main() {
pid_t pid;
if ((pid = fork()) < 0)
{
perror("fork");
exit(1);
} else if (pid == 0)
{
printf("before child pid = %d, ppid = %d, pgid=%d\n", getpid(), getppid(), getpgid(0));
sleep(5);
printf("after child pid = %d, ppid = %d, pgid=%d\n", getpid(), getppid(), getpgid(0));
} else {
sleep(1);
setpgid(pid, pid);
sleep(2);
printf("before parent pid = %d, ppid = %d, pgid=%d\n", getpid(), getppid(), getpgrp());
setpgid(getpid(),getppid());
printf("after bparent pid = %d, ppid = %d, pgid=%d\n", getpid(), getppid(), getpgrp());
while(1);
}
return 1;
}
创建会话
创建一个会话需要注意以下6点注意事项:
- 调用进程不能是进程组组长,该进程变成新会话首进程(session header)
- 该进程成为一个新进程组的组长进程。
- 需有root权限(ubuntu不需要)
- 新会话丢弃原有的控制终端,该会话没有控制终端
- 该调用进程是组长进程,则出错返回
- 建立新会话时,先调用fork, 父进程终止,子进程调用setsid
使用ps -ajx
USER PID PPID PGID SESS JOBC STAT TT TIME COMMAND
arkleoliu 81103 5661 81103 0 4 S+ s002 0:00.00 cat
arkleoliu 81104 5661 81103 0 4 S+ s002 0:00.00 cat
arkleoliu 81105 5661 81103 0 4 S+ s002 0:00.00 cat
arkleoliu 81106 5661 81103 0 4 S+ s002 0:00.00 cat
守护进程
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <fcntl.h>
#include <sys/stat.h>
void main() {
pid_t pid = fork();
if (pid > 0 || pid == -1)
{
return;
}
setsid();
chdir(".");
umask(0);
close(STDIN_FILENO);
open("/dev/null", O_RDWR);
dup2(0, STDOUT_FILENO);
dup2(0, STDERR_FILENO);
}
网友评论