(二十三)进程——获取进程id相关函数的介绍和使用

来源:互联网 发布:淘宝卖家进入 编辑:程序博客网 时间:2024/06/04 23:28


  上一节中我们知道怎么通过fork函数创建(或者说是复制)一个进程,但是我们要怎么样操作这个被创建出来的进程呢?那就需要用到他的进程id,所以就要获取进程id,一下提供一些获取进程id的函数和其使用方法。
  


1)getpid和gteppid

#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\n");    /*     *上面的语句如果没有\n那么就会在子进程中也打印一句     *这个是由于printf的机制造成的,遇到\n就出栈,     *若没有\n那么会在执行下一条语句的时候前出栈,     *而下一条语句是fork,此时已经复制主进程的环境,其中包括打印     */    pid = fork();//调用fork时,子进程会从下面的语句开始执行    if(pid > 0)    {        while(1)        {            printf("I am parent\n");            printf("parent's pid id %d\n",getpid());            printf("parent's father is %d\n\n",getppid());            sleep(2);        }    }    else if(pid == 0)    {    while(1)        {            printf("I am child\n");            printf("child's pid id %d\n",getpid());            printf("child's father is %d\n\n",getppid());            sleep(2);        }    }    else    {        perror("fork");        exit(1);    }    return 0;}

输出结果:

this is a testI am parentparent's pid id 4040parent's father is 3348I am childchild's pid id 4041child's father is 4040I am parentparent's pid id 4040parent's father is 3348I am childchild's pid id 4041child'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);  //返回实际用户IDuid_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\n",getuid());    printf("有效用户ID = %d\n",geteuid());    return 0;}

输出结果:

实际用户ID = 1000有效用户ID = 1000

3)getgid和getegid

#include <unistd.h>#include <sys/types.h>gid_t getgid(void); //返回实际用户组IDgid_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\n",getgid());    printf("有效用户组ID = %d\n",getegid());    return 0;}

输出结果:

实际用户组ID = 1000有效用户组ID = 1000
5 0