Linux进程的创建

来源:互联网 发布:计算机c语言基础知识 编辑:程序博客网 时间:2024/05/15 23:38

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进程

0 0