1.进程概念

          进程是一个动态实体,他是操作系统分配资源的最小单位,是程序的一次执行过程。

2.进程标识

         操作系统中每个进程都可以使用一个ID来进行标志的,即进程ID,该ID是一个非负数可以通过相应函数获得

         getpid      获得进程ID

         getppid    获得父进程ID

         getuid      获得进程的实际用户ID //获得运行程序的用户ID

         geteuid    获得进程的有效用户ID //某个用户A,运行了一个程序,而该程序是以root身份运行的,该程序拥有root权限实际用户ID为root ID

        getgid       获得进程实际组ID //运行程序用户的组ID

         getegid    获得进程有效组ID //程序的实际用户ID的组ID

3.linux进程结构

         一个进程是由代码段,数据段,堆栈段,数据段中存放的是全局变量,常量,静态变量。堆栈段存放的是局部变量,和动态分配的内存变量。

4.linux进程状态

         运行状态   进程正在运行

         可中断等待状态    程序正在等待某个事件完成

         僵死状态      进程已终止,知道父进程wait 函数后释放

          停止状态     进程因为收到信号后停止运行或者该进程正在被跟踪。

#include<sys/types.h>
#include<iostream>
#include<stdio.h>
#include<unistd.h>
int main()
{
pid_t pid=0;
printf("current process id is %d\n",getpid());
printf("parent process id is %d\n",getppid());
printf("process user id is %d\n",getuid());
printf("real user process id %d\n",geteuid());
printf("group process id is %d\n",getgid());
printf("real group process id is %d\n",getegid());
pid=fork();
switch(pid)
{
case 0:
printf("child process return success\n");
break;
case -1:
printf("process created failed \n");
break;
default:
printf("the child process created successfully %d \n",pid);
break;
}

}


这样我们就获得了关于进程的所有标识,我在想fork函数应该只是对当前进程的拷贝,拷贝之后,父进程和子进程之间共享的应该是代码段,而堆栈段和数据段则是不同的,也

就是说父进程和子进程的运行轨迹是一样的,但是数据却是不同的。

fork函数的返回值是有两个的,其中一个是子进程的返回值,是0

另外一个则是在父进程的返回值,他返回的是子进程的ID值

当然如果失败的话,返回的是-1,其错误值放在errno当中,而excel则会指定用文件创建的。

vfork函数并不是复制父进程的地址空间,而是共享父进程的地址空间,也就是说,子进程完全运行在父进程的地址空间商,子进程对改地址空间中的修改对父进程也是可见的

fork创建一个子进程时,那个进程先运行,取决于系统的调度算法,而vfork函数创建的子进程则会保证子进程先运行,当他调用exec或者exit之后父进程才会被调度运行,如果

子进程运行时依赖父进程的某个行为,则会导致死锁

fd = vfork();
if(fd > 0)
{
printf("Here is father and child is %d\n",fd);
//waitpid(fd,&status,0);
}
if(fd == 0)
{
printf("Here is child\n");
execl("/home/zjc/process/localtime","hello",(char*)0);
}

这里借用别人的代码讲述下自己的理解,或者说是看了讲解之后自己的理解吧

vfork创建的进程之后立即执行子进程,也就是fd返回是0的代码段,也就是立即打印的是Here is child

然后呢就是创建新的进程localtime,创建完成之后子进程结束,打印Here is father and child is ...(这期间不用去管localtime程序是否执行完成,创建成功就是vfork的子进程结

束)这样呢,localtime的父进程结束了,localtime也就成了孤儿进程。由init收养,也就是说,localtime进程的父进程成为了init进程