进程的创建

本文详细介绍了fork和vfork两种系统调用的功能及区别,包括如何使用这两种调用来创建新的进程,以及它们在内存管理和进程间数据共享方面的不同之处。此外,还解释了僵尸进程的概念及其产生的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

fork():    用来创建新的进程;在父进程中返回子进程的进程号,在子进程中返回0,错误返回-1

             表头文件:#include<unistd.h> 

                               #include<sys/types.h>

              定义函数:pid_t fork(void)   pid_t:创建进程时会用到进程号的类型定义,实际上为int类型;

 

 

        在fork()创建一个进程的同时,子进程完全复制父进程的资源,产生一个副本,但是采用写时复制的策略,这样可以延迟真正的数据复制,写入数据后,意味着子父进程的数据开始不一致了,于是产生复制动作,每个进程拿到属于自己的一份,这样就可以系统调用的开销;


 

#include<stdio.h>

#include<sys/types.h>

#include<unistd.h>

#include<sys/wait.h>



int main()

{

    pid_t pid;

    int count =0;

    printf("hello_linux,count =%x\n",&count);

    pid=fork();

    printf("@@@fork() is %d\n",pid);

    if(pid>0)

    {

        printf("++child has the pid:%d\n",pid);

        count++;

        printf("+++count = %d,%x\n",count,&count);

        wait(NULL);

    }

    else if(!pid)

    {

        sleep(2);

        printf("----count = %d,%x\n",count,&count);

    }

    else

    {

        printf("frok error");

    }

    count++;

    printf("pid = %d,count = %d\n",getpid(),count);

    return 0;

}

 

            vfork():    用来创建新的进程;在父进程中返回子进程的进程号,在子进程中返回0,错误返回-1

                         表头文件:#include<unistd.h>  

           vfork()与fork()不同的地方在于,用vfork创建的子进程与父进程共享内存空间,也就是说子进程完全运行在父进程的地址空间上,如果这是子进程修改了某个变量,这将影响到父进程;需要注意的是用vfork()创建的子进程必须显示调用exit()来结束,否则子进程将不能结束,而fork()则不存在这个状况;

   

僵尸进程:

            僵尸进程就是已经结束了的进程,但是还没有从进程表中删除,它放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,它需要它的父进程为他收尸,如果父进程没有安装SIGCHLD信号处理函数调用wait()或者waitpid()等待子进程结束,又没有显示忽略该信号,那么它就一直保持僵尸状态。如果父进程结束了,那么init进程会接手这个进程为它收尸,它还是可以被清除的。但是,如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值