UNIX环境高级编程读书笔记(八)—进程控制 (1)

本文介绍了Linux系统中的进程管理基本概念,包括获取进程ID、父进程ID、用户ID和组ID的方法,以及如何使用fork函数创建子进程。通过示例程序展示了这些函数的实际应用。

转自: http://rpf413.blog.163.com/blog/static/45563760201153022139656/

一、进程ID

1.

名称::

getpid

功能:

获得进程id.

头文件:

#include <unistd.h>

函数原形:

pid_t getpid(void);

参数:

返回值:

进程id.

每个进程都有一个非负整数表示的唯一进程id。系统中有一些专用的进程该进程是内核的一部分,它并不执行任何磁盘上的程序。因此也被称为系统进程。

进程1通常是init进程,在自举过程完成时有内核调用。此进程负责在自举内核后启动一个UNIX系统。init通常读与系统有关的初始化文件(/ect/re*文件或/ect/inittab文件,以及/ect/init.d中的文件),并将系统引导到一个状态。但要注意init并不是一个系统进程,它是一个普通用户进程,但是它以超级用户特权运行。

 

2.

名称::

getppid

功能:

获得进程的父进程id

头文件:

#include <unistd.h>

函数原形:

pid_t getppid(void);

参数:

返回值:

父进程id.

3.

名称::

getuid/geteuid

功能:

获得调用进程用户的实际用户id和有效用户id.

头文件:

#include <unistd.h>

函数原形:

uid_t getuid(void);

uid_t geteuid(void)

参数:

返回值:

用户id.

 4.

名称::

getgid/getegid

功能:

获得调用进程用户的实际组id和有效组id.

头文件:

#include <unistd.h>

函数原形:

gid_t getgid(void);

gid_t getegid(void);

参数:

返回值:

用户组id.

与一个进程相关联的用户id用6个或更多,他们是:实际用户id          实际组id       有效用户id        有效组id        保存的设置用户id  保存的设置组id

实际用户id和实际组id标识我们究竟是谁。这两个字段在登陆时取自口令文件中的登陆项。通常,在一个登陆会话间这些值并不改变,但是超级用户进程又方法改变它们。

       有效用户id和有效组id以及附加组id决定了我们的文件访问权限。

       保存的设置用户id和保存的设置组id在执行一个程序是包含了有效用户id和有效组id的副本。

通常有效用户id等于实际用户id,有效组id等于实际组id。它们不同的情况通过发生在变更用户权限,但是不切换用户的情况下。

linux中有许多id,我们要注意这些id 的区别。getpid,getuid是获得当前进程和进程组的id,而getuid,geteuid,getgid,getegid是获取当前用户和用户组的id 。

 

下面的程序打印和进程id和用户id

/*8_1.c*/

#include <unistd.h>

 

main()

{

printf(“pid:%d\n”,getpid());/*获得进程id*/

printf(“ppid:%d\n”,getppid());/*获得父进程id*/

printf(“uid:%d\n”,getuid());/*获得当前用户的实际用户id*/

printf(“euid:%d\n”,geteuid());/*获得当前用户的有效用户id*/

printf(“gid:%d\n”,getgid());/*获得当前用户的实际组id*/

printf(“egid:%d\”,getegid());/*获得当前用户的有效组id*/

}

 

 

二、创建进程

5.

名称::

fork

功能:

创建一个进程

头文件:

#include <unistd.h>

#include <sys/types.h>

函数原形:

pid_t fork(void);

参数:

返回值:

子进程返回0,父进程返回子进程id,出错返回1。

 由fork创建的进程称为子进程,fork函数被调用一次,但返回两次。两次返回唯一区别是子进程返回的是0,父进程返回的是子进程的id.子进程是父进程的副本子进程获得父进程数据空间、堆和栈的副本。父、子进程并不共享这些存储空间,父、子进程只共享正文段。由于在fork之后经常跟着exec,所以现在很多实现并不执行一个父进程数据段、堆和栈的完全复制,它们采用一种叫做写时复制技术。

       fork有两种用法:

(1)    一个父进程希望复制自己,使父、子进程同时执行不同的代码段。

(2)    一个进程要执行一个不同的程序。这对shell是常见的情况。

下面是fork函数的一个例子。

/*8_2.c*/

include <unistd.h>

#include <sys/types.h>

 

int main()

{

pid_t pid;

 

if((pid=fork())==0)

    printf(“I’am child,my id is %d\my father id is %d\n”,getpid(),getppid()”);

else

    printf(“I’am father, my id is %d\nmy child id is %d\n”,getpid(),pid);

}

 

下面运行结果:

#./8_2

I’am child,my id is 1859

my father id is 1858

I’am father, my id is 1858

my child id is 1859



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值