linux c 进程学习

来源:互联网 发布:淘宝助理创建宝贝模板 编辑:程序博客网 时间:2024/06/10 07:34

1.fork

由于fork后的父进程与子进程的优先级是一样的,所以会存在父进程已经退出了而子进程还在执行,这时候的子进程就是孤儿进程,会被init进程收养,所以这时候getppid得到的1。

int main(){pid_t pid;pid = fork();switch(pid){case 0:printf("孩子进程,pid:%d,父进程pid:%d\n",getpid(),getppid());break;case -1:printf("进程创建失败。\n");break;default:printf("父亲进程,pid:%d,孩子进程pid:%d\n",getpid(),pid);wait(NULL);//等待子进程 防止孤儿进程break;}exit(0);}

  2.vfork

由vfork也是用来创建进程,但是子进程是共享父进程的地址空间,也就是两者的变量是共享的,而fork是复制的两者不共享。vfork会保证子进程先执行,当子进程 exec 或者 exit后才可能会被调度,如果未调用exec 或者 exit 将出现段错误。


int glab_var = 0;int main(){int i=0;int var = 0;pid_t pid;pid = vfork();switch(pid){case 0:printf("pid:%d\n",getpid());printf("ppid:%d\n",getppid());printf("孩子 i:%d\n",i);while(i<5){i++;var++;glab_var++;}printf("孩子  var:%d,glab:%d\n",var,glab_var);exit(0);break;case -1:exit(0);break;default:printf("pid:%d\n",getpid());printf("cpid:%d\n",pid);printf("父亲 i:%d\n",i);i=0;while(i<3){i++;var++;glab_var++;}printf("父亲  var:%d,glab:%d\n",var,glab_var);//wait(NULL);exit(0);break;}}

原创粉丝点击