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

被折叠的 条评论
为什么被折叠?



