fork和vfork

fork

  fork函数的功能是创建子进程:

#include <unistd.h>
pid_t fork ( void );

  fork的奇妙之处在于:它被调用一次,却返回两次。它可能有3种不同的返回值:

  • 在父进程中,fork返回新创建的子进程的PID
  • 在子进程中,fork返回0
  • 如果出现错误,fork返回一个负值。

fork实例1

  代码实例:

#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"

int main() {
    pid_t pid;
    pid = fork();

    if ( pid > 0 ) {
        printf ( "This is father process\n" );
        exit ( 0 );
    } else {
        printf ( "This is child process\n" );
        exit ( 0 );
    }
}

执行结果:

This is father process
This is child process

  在pid = fork();之前,只有一个进程在执行,但在这条语句执行之后,就变成两个进程在执行了。
  这两个进程共享代码段,将要执行的下一条语句都是if ( pid > 0 ) {}
  原来就存在的进程被称作父进程,新出现的进程被称作子进程,父子进程的区别在于PID不同。

fork实例2

  代码实例:

#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"

int main() {
    pid_t pid;
    int count = 0;
    pid = fork();
    count++;
    printf ( "count is %d\n", count );
    exit ( 0 );
}

执行结果:

count = 1
count = 1

  对fork函数,子进程的数据空间、堆栈空间都会从父进程得到一个拷贝,而不是共享。
  在子进程中,对count进行加1的操作,并没有影响到父进程中的count,父进程中的count仍然为0

vfork

  vfork函数的功能是创建子进程:

#include <sys/types.h>
#include <unistd.h>
pid_t vfork ( void );

  vforkfork的区别如下:

  • fork:子进程拷贝父进程的数据段,父、子进程的执行次序不确定。
  • vfork:子进程与父进程共享数据段,子进程先运行,父进程后运行。

vfork实例1

  代码实例:

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

int main ( void ) {
    pid_t pid;
    int var = 88;

    if ( ( pid = vfork() ) < 0 ) {
        printf ( "vfork error" );
        exit ( -1 );
    } else if ( pid == 0 ) { /* 子进程 */
        var++;
        exit ( 0 );
    }

    printf ( "pid = %d, var = %d\n", getpid(), var );
    return 0;
}

执行结果:

pid = 283, var = 89

注意,从子进程中退出必须使用exit函数,不能使用return函数。

vfork实例2

  代码实例:

#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"

int main() {
    pid_t pid;
    int count = 0;
    pid = vfork();
    count++;
    printf ( "count is %d\n", count );
    exit ( 0 );
}

执行结果:

count is 1
count is 2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值