linux下使用fork和vfork创建子进程

一、使用fork创建子进程

1.1、函数原型

函数原型:pid_t fork(void);
头文件: #include <sys/types.h>
        #include <unistd.h>
返回值:成功返回0或子进程的pid

1.2、fork创建的子进程和父进程之间的关系

1)子进程是父进程的拷贝,调用fork函数后,系统会为子进程拷贝fork之前父进程拥有的资源;

2)使用fork创建的子进程和父进程运行在不同的地址空间;

3) 子进程不继承父进程的内存锁、信号量、定时器等资源;

4) fork函数调用一次返回两次,在父进程中返回子进程的pid,在子进程中返回0;

5) 子进程和父进程的数据空间独立,在子进程中改变全局变量不影响父进程同名的全局变量的值;

6)fork函数创建的子进程和父进程的执行顺序是不确定的;

二、使用vfork创建子进程

1.1、函数原型

函数原型:pid_t vfork(void);
头文件: #include <sys/types.h>
        #include <unistd.h>
返回值:成功返回0或子进程的pid

2.vfork函数创建的子进程和父进程的关系

1)vfork能够保证子进程始终比父进程先运行;

2)父进程会一直处于挂起状态,直到vfork创建的子进程结束;

3)vfork创建的子进程和父进程共用数据空间,在子进程中改变全局变量的值,在父进程中同样有效;

三、代码实例

fork创建子进程代码:

#include <unistd.h>
#include <pthread.h>
#include  <netdb.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/select.h>
#include <stdlib.h>

int value = 0;
void main(int argc,char *argv[])
{
	int ret = -1;
    pid_t pid = 0;
	pid = fork();
	if(pid < 0)return;
    if(pid == 0)
	{
		while(1)
		{
			printf("child process,value=%d\r\n",value);
			value++;
			sleep(1);
			if(value == 5)break;
		}
	}
	else
	{
		while(1)
		{
			printf("father process,value=%d\r\n",value);
			value+=2;
			sleep(1);
		}
	}
}

运行结果:

在这里插入图片描述

vfork创建子进程代码:

#include <unistd.h>
#include <pthread.h>
#include  <netdb.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/select.h>
#include <stdlib.h>

int value = 0;
void main(int argc,char *argv[])
{
	int ret = -1;
    pid_t pid = 0;
	pid = vfork();
	if(pid < 0)return;
    if(pid == 0)
	{
		while(1)
		{
			printf("child process,value=%d\r\n",value);
			value++;
			sleep(1);
			if(value == 5)break;
		}
	}
	else
	{
		while(1)
		{
			printf("father process,value=%d\r\n",value);
			value+=2;
			sleep(1);
		}
	}
}

运行结果:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个简单的示例代码,演示如何通过调用fork和vfork函数,在Linux平台上创建一个新进程: ``` #include <stdio.h> #include <unistd.h> #include <sys/types.h> int main() { pid_t pid_fork, pid_vfork; int i = 0; // 使用fork函数创建一个新进程 pid_fork = fork(); if (pid_fork < 0) { fprintf(stderr, "Fork failed"); return 1; } else if (pid_fork == 0) { // 子进程 printf("This is child process created by fork. i=%d\n", ++i); } else { // 父进程 printf("This is parent process. Child pid=%d, i=%d\n", pid_fork, i); } // 使用vfork函数创建一个新进程 pid_vfork = vfork(); if (pid_vfork < 0) { fprintf(stderr, "vfork failed"); return 1; } else if (pid_vfork == 0) { // 子进程 printf("This is child process created by vfork. i=%d\n", ++i); _exit(0); } else { // 父进程 printf("This is parent process. Child pid=%d, i=%d\n", pid_vfork, i); } return 0; } ``` 在上面的示例代码中,我们首先使用fork函数创建了一个新进程,然后在父进程和子进程中打印出不同的信息。接着,我们使用vfork函数创建了另一个新进程,同样在父进程和子进程中打印出不同的信息。需要注意的是,在使用vfork函数创建子进程后,子进程必须要调用_exit函数或者exec函数,否则可能会引起一些不可预知的问题。 当我们编译并运行上述代码时,可以得到如下输出结果: ``` This is parent process. Child pid=12345, i=0 This is child process created by fork. i=1 This is child process created by vfork. i=2 ``` 可以看到,我们通过调用fork和vfork函数,成功地创建了两个新进程,并在父进程和子进程中打印出了不同的信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值