全部博文(71)
分类: LINUX
2008-04-15 21:00:42
一、进程ID
1.
名称:: |
getpid |
功能: |
获得进程id. |
头文件: |
#include |
函数原形: |
pid_t getpid(void); |
参数: |
无 |
返回值: |
进程id. |
每个进程都有一个非负整数表示的唯一进程id。系统中有一些专用的进程该进程是内核的一部分,它并不执行任何磁盘上的程序。因此也被称为系统进程。
进程1通常是init进程,在自举过程完成时有内核调用。此进程负责在自举内核后启动一个UNIX系统。init通常读与系统有关的初始化文件(/ect/re*文件或/ect/inittab文件,以及/ect/init.d中的文件),并将系统引导到一个状态。但要注意init并不是一个系统进程,它是一个普通用户进程,但是它以超级用户特权运行。
2.
名称:: |
getppid |
功能: |
获得进程的父进程id |
头文件: |
#include |
函数原形: |
pid_t getppid(void); |
参数: |
无 |
返回值: |
父进程id. |
3.
名称:: |
getuid/geteuid |
功能: |
获得调用进程用户的实际用户id和有效用户id. |
头文件: |
#include |
函数原形: |
uid_t getuid(void); uid_t geteuid(void) |
参数: |
无 |
返回值: |
用户id. |
4.
名称:: |
getgid/getegid |
功能: |
获得调用进程用户的实际组id和有效组id. |
头文件: |
#include |
函数原形: |
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 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 #include |
函数原形: |
pid_t fork(void); |
参数: |
无 |
返回值: |
子进程返回0,父进程返回子进程id,出错返回1。 |
由fork创建的进程称为子进程,fork函数被调用一次,但返回两次。两次返回唯一区别是子进程返回的是0,父进程返回的是子进程的id.子进程是父进程的副本子进程获得父进程数据空间、堆和栈的副本。父、子进程并不共享这些存储空间,父、子进程只共享正文段。由于在fork之后经常跟着exec,所以现在很多实现并不执行一个父进程数据段、堆和栈的完全复制,它们采用一种叫做写时复制技术。
fork有两种用法:
(1) 一个父进程希望复制自己,使父、子进程同时执行不同的代码段。
(2) 一个进程要执行一个不同的程序。这对shell是常见的情况。
下面是fork函数的一个例子。
/*8_2.c*/ include #include 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 |