我们知道怎么通过fork函数创建(或者说是复制)一个进程,但是我们要怎么样操作这个被创建出来的进程呢?那就需要用到他的进程id,所以就要获取进程id,一下提供一些获取进程id的函数和其使用方法。
1)getpid和gteppid
s
#include <sys/types.h> #include <unistd.h> pid_t getpid(void); //返回调用进程的PID号 pid_t getppid(void); //返回调用进程父进程的PID号 例子: #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> int main(void) { pid_t pid; printf("this is a test "); /* *上面的语句如果没有 那么就会在子进程中也打印一句 *这个是由于printf的机制造成的,遇到 就出栈, *若没有 那么会在执行下一条语句的时候前出栈, *而下一条语句是fork,此时已经复制主进程的环境,其中包括打印 */ pid = fork();//调用fork时,子进程会从下面的语句开始执行 if(pid > 0) { while(1) { printf("I am parent "); printf("parent's pid id %d ",getpid()); printf("parent's father is %d ",getppid()); sleep(2); } } else if(pid == 0) { while(1) { printf("I am child "); printf("child's pid id %d ",getpid()); printf("child's father is %d ",getppid()); sleep(2); } } else { perror("fork"); exit(1); } return 0; }
输出结果:
this is a test
I am parent
parent's pid id 4040
parent's father is 3348
I am child
child's pid id 4041
child's father is 4040
I am parent
parent's pid id 4040
parent's father is 3348
I am child
child's pid id 4041
child's father is 4040
2)getuid和geteuid
概念补充:
1、实际用户ID和实际用户组ID:标识我是谁。也就是登录用户的uid和gid,比如我的Linux以simon登录,在Linux运行的所有的命令的实际用户ID都是simon的uid,实际用户组ID都是simon的gid(可以用id命令查看)。
2、有效用户ID和有效用户组ID:进程用来决定我们对资源的访问权限。一般情况下,有效用户ID等于实际用户ID,有效用户组ID等于实际用户组ID。当设置-用户-ID(SUID)位设置,则有效用户ID等于文件的所有者的uid,而不是实际用户ID;同样,如果设置了设置-用户组-ID(SGID)位,则有效用户组ID等于文件所有者的gid,而不是实际用户组ID。
#include <unistd.h>
#include <sys/types.h>
uid_t getuid(void); //返回实际用户ID
uid_t geteuid(void); //返回有效用户ID
例子:
#include <stdio.h> #include <unistd.h> #include <sys/types.h> /* uid_t getuid(void); //返回实际用户ID uid_t geteuid(void); //返回有效用户ID */ int main(void) { printf("实际用户ID = %d ",getuid()); printf("有效用户ID = %d ",geteuid()); return 0; }
输出结果:
实际用户ID = 1000
有效用户ID = 1000
3)getgid和getegid
#include <unistd.h>
#include <sys/types.h>
gid_t getgid(void); //返回实际用户组ID
gid_t getegid(void); //返回有效用户组ID
例子:
#include <stdio.h> #include <unistd.h> #include <sys/types.h> /* gid_t getgid(void); //返回实际用户组ID gid_t getegid(void); //返回有效用户组ID */ int main(void) { printf("实际用户组ID = %d ",getgid()); printf("有效用户组ID = %d ",getegid()); return 0; }
输出结果:
实际用户组ID = 1000
有效用户组ID = 1000