您的位置:首页 > 其它

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

2017-01-06 18:49 811 查看
  上一节中我们知道怎么通过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 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\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); //返回实际用户组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\n",getgid());
printf("有效用户组ID = %d\n",getegid());

return 0;
}


输出结果:

实际用户组ID = 1000
有效用户组ID = 1000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: