linux使用fork函数添加一个子进程—面试

fork函数用于创建子进程,成功返回时,父进程得到子进程的PID,子进程得到0。子进程继承父进程的代码并使用写时拷贝技术,只有在修改时才会复制内存。在早期Linux中是全拷贝,现在采用更高效的写时拷贝。常用于网络服务,父进程复制自身处理客户端请求。
  1. fork函数返回值:
    ①调用成功返回两个数,一个等于0(代表当前是子进程);一个大于0,并且刚好等于子进程的pid号(代表当前是父进程)。
    ②调用失败返回-1;
  2. fork函数调用以后子进程会拷贝一份父进程的代码,这些进程不共享,fork之后,子进程进行了写时拷贝(Copy-On-Write)技术,如果父子进程中的任意一个试图修改这些区域,则内核只为修改区域的那块内存制作一个副本。
  3. 父子进程之间谁先执行后执行由进程的调度决定
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
        pid_t pid;
        pid_t pidfork;
        pid=getpid();
        int data=10;
        pidfork=fork();

        if(pidfork>0){
                printf("this is father proceeding,pidfork=%d\n",pidfork);
        }
        else if(pidfork==0){
                printf("this is child proceeding,pidfork=%d,childpid=%d\n",pidfork,getpid());
                data+=10;
        }
        
		printf("data=%d\n",data);
        return 0;
  1. fork函数仿照网络中服务器接收客户端实例代码
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include<stdlib.h>
int main()
{
        int data;
        while(1){
                printf("input your data:\n");
                scanf("%d",&data);
                if(data==1){
                        pid_t pidfork=fork();
                        if(pidfork==0){
                                while(1){
                                        printf("do net getpid=%d\n",getpid());
                                        sleep(3);
                                }
                        }
                }else
                {
                        printf("No\n");

                }

        }
        return 0;
}

  1. 进程创建发生了什么事

在早期linux环境fork以后进程会进行一个全拷贝,也就是子进程会把全部父进程的东西拷贝一份,然后子进程在上面运行;现在Linux环境在fork以后进行的是写时拷贝(在需要修改时才拷贝,不修改则运用原来的代码)

  1. fork创建一个子进程的一般目的
  • 一个父进程希望复制自己,使父、子进程同时执行不同的代码段。这在网络服务进程中是常见的—父进程等待客户端的服务请求。当这种请求到达时,父进程调用fork,使子进程处理此请求。父进程则继续等待下一个服务请求到达。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值