UNIX环境高级编程读书笔记(八)—进程控制 (1)
来源:互联网 发布:软件ui设计师 工程师 编辑:程序博客网 时间:2024/06/06 03:45
转自: 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环境高级编程读书笔记(八)—进程控制 (1)
- UNIX环境高级编程读书笔记(八)—进程控制 (1)
- UNIX环境高级编程读书笔记(八)—进程控制 (1)
- UNIX环境高级编程读书笔记(八)—进程控制 (2)
- UNIX环境高级编程读书笔记(八)—进程控制 (3)
- UNIX环境高级编程读书笔记(八)—进程控制 (2)
- UNIX环境高级编程读书笔记(八)—进程控制 (3)
- UNIX环境高级编程读书笔记(八)—进程控制 (2)
- UNIX环境高级编程读书笔记(八)—进程控制 (3)
- 《UNIX环境高级编程》八进程控制读书笔记
- UNIX环境高级编程(八)进程控制
- linux进程控制(一)--unix环境高级编程读书笔记
- UNIX环境高级编程读书笔记(十三)—守护进程
- UNIX环境高级编程读书笔记(十三)—守护进程
- Unix环境高级编程-进程控制(1)
- UNIX环境高级编程学习笔记(八)进程环境
- UNIX环境高级编程读书笔记(七)—进程环境 (1)
- UNIX环境高级编程读书笔记(七)—进程环境 (1)
- 判断是否已经安装android应用
- SVN checkout
- Linux 下开启和关闭IPv6的方法
- C#,winform,ShowDialog,子窗体向父窗体传值
- VMware 虚拟机 Fedora18 的VMware Tools安装
- UNIX环境高级编程读书笔记(八)—进程控制 (1)
- 三角函数
- red hat mysql
- The Most Important Algorithms
- adb install parameter
- SVN+Google Code 安装使用详解
- 基于Qt平台的Mac可读系统版本的获取
- Unity3d中的公告板
- Struts2中接受页面参数的几种形式