码迷,mamicode.com
首页 > 系统相关 > 详细

进程控制fork vfork

时间:2017-02-10 19:54:23      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:调用exe   pre   ret   依赖   空间   nice   ice   case   pid   

主要函数:

fork 用于创建一个新进程

exit 用于终止进程

exec 用于执行一个程序

wait 将父进程挂起,等待子进程结束

getpid 获取当前进程的进程ID

nice 改变进程的优先级

---------------------------------

孤儿进程:

如果一个子进程的父进程先于子进程结束,子进程就成为一个孤儿进程,他由init进程收养,成为init进程的子进程。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>


int main() 
{

    pid_t pid;
    pid = fork();
    
    switch( pid )
    {
        case 0:
        {
            while(1)
            {
                printf("child pid:%d, parent pid:%d\n", getpid(), getppid());
                sleep(1);
            }
        }
        case -1:
        {
            printf("create child process error\n");
            exit(-1);
        }
        default:
        {
            sleep(3);
            printf("I am parent,pid:%d\n", getpid());
            exit(0);
        }

    }

    return 0;
    
}

 

child pid:9670, parent pid:9669
child pid:9670, parent pid:9669
child pid:9670, parent pid:9669
I am parent,pid:9669
root@wilson-software:~/Project/xa# child pid:9670, parent pid:1
child pid:9670, parent pid:1
child pid:9670, parent pid:1
child pid:9670, parent pid:1
child pid:9670, parent pid:1
child pid:9670, parent pid:1

从输出结果来看,父进程停止后,子进程变成了孤儿进程,此时子进程的父进程ID 是 1,

(init进程的进程ID值始终是1)由init进程收养。

------------------------------------------------------------------------------

vfork函数创建一个子进程时,操作系统并不将父进程的地址空间完全复制到子进程,用vfork函数创建的子进程共享父进程的地址空间,

也就是说子进程完全运行在父进程的地址空间上。子进程对该地址空间中任何数据的修改同样为父进程所见。

使用fork创建一个子进程时,哪个进程先执行取决于系统的调度。

而vfork创建一个子进程时,vfork保证子进程先运行,当他调用exec或者exit之后,父进程才可能被调度执行。

如果在调用exec或者exit之前子进程要依赖父进程的某个行为,就会导致死锁。

如果创建子进程的目的只是为了调用exec执行某个程序,那么fork过程中子进程对父进程地址空间的复制将会是一个多余的过程。

vfork不会拷贝父进程的地址空间,这大大减小了系统开销。

使用vfork时要谨慎,最好不要允许子进程修改与父进程共享的全局变量和局部变量

 

进程控制fork vfork

标签:调用exe   pre   ret   依赖   空间   nice   ice   case   pid   

原文地址:http://www.cnblogs.com/zhangxuan/p/6387422.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!