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

转自: 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



你可能感兴趣的:(unix高级编程)