关闭

fork创建进程

324人阅读 评论(0) 收藏 举报
分类:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>


int main(int argc,char *argv[])
{
        pid_t child;
        int count  = 100;
        printf("Parrent process [%d] start...\n",getpid());
        printf("Parrent [%d] start create child process:\n",getpid());
        child = fork();
        //fail
        if(child < 0)
        {
                printf("Parrent process [%d] create child fail!\n",getpid());
                printf("%s\n",strerror(errno));
                return -1;
        }
        else if (child == 0)
        {
                printf("count = %d",++count);
                printf("Child process [%d] ,parrent [%d]\n",getpid(),getppid());
                printf("child process [%d] finish,quit!\n",getpid());
                exit(0);
        }
        else
        {
                sleep(1);
                printf("Parrent process [%d] create child [%d] sucess\n",getpid(),child);
        }
        printf("Only parrent do......[%d],count = [%d]\n",getpid(),count);
        return 0;
}
-------------------------------------解决僵尸程----------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>


int main(int argc,char *argv[])
{
        pid_t child;
        int count  = 100;
        printf("Parrent process [%d] start...\n",getpid());
        printf("Parrent [%d] start create child process:\n",getpid());
        child = fork();
        //fail
        if(child < 0)
        {
                printf("Parrent process [%d] create child fail!\n",getpid());
                printf("%s\n",strerror(errno));
                return -1;
        }
        else if (child == 0)
        {
                sleep(3);
                printf("count = %d",++count);
                printf("Child process [%d] ,parrent [%d]\n",getpid(),getppid());
                printf("child process [%d] finish,quit!\n",getpid());
                exit(0);
        }
        else
        {
                //sleep(1);
                wait();
                printf("Parrent process [%d] create child [%d] sucess\n",getpid(),child);
        }
        printf("Only parrent do......[%d],count = [%d]\n",getpid(),count);
        return 0;
}
--------------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>

void signal_handler(int sig_num)
{
        switch(sig_num)
        {
                case SIGCHLD:
                {
                        wait();
                }
                break;
        }
}


int main(int argc,char *argv[])
{
        pid_t child;
        int count  = 100;
        signal(SIGCHLD,signal_handler);
        printf("Parrent process [%d] start...\n",getpid());
        printf("Parrent [%d] start create child process:\n",getpid());
        child = fork();
        //fail
        if(child < 0)
        {
                printf("Parrent process [%d] create child fail!\n",getpid());
                printf("%s\n",strerror(errno));
                return -1;
        }
        else if (child == 0)
        {
                sleep(3);
                printf("count = %d",++count);
                printf("Child process [%d] ,parrent [%d]\n",getpid(),getppid());
                printf("child process [%d] finish,quit!\n",getpid());
                exit(0);
        }
        else
        {
                //sleep(1);
                //wait();
                while(1)
                {
                        printf("Parrent process [%d] create child [%d] sucess\n",getpid(),child);
                        sleep(1);
                }
        }
        printf("Only parrent do......[%d],count = [%d]\n",getpid(),count);
        return 0;
}
---------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>

void signal_handler(int sig_num)
{
        switch(sig_num)
        {
                case SIGCHLD:
                {
                        wait();
                }
                break;
        }
}


int main(int argc,char *argv[])
{
        pid_t child;
        int count  = 100;
        //signal(SIGCHLD,signal_handler);
        printf("Parrent process [%d] start...\n",getpid());
        printf("Parrent [%d] start create child process:\n",getpid());
        child = fork();
        //fail
        if(child < 0)
        {
                printf("Parrent process [%d] create child fail!\n",getpid());
                printf("%s\n",strerror(errno));
                return -1;
        }
        else if (child == 0)
        {
                sleep(3);
                printf("count = %d",++count);
                printf("Child process [%d] ,parrent [%d]\n",getpid(),getppid());
                child = fork();
                if(child == 0)
                {
                        while(1)
                        {
                                printf("child child [%d] [%d]\n",getpid(),getppid());
                                sleep(1);
                        }
                }
                else
                {
                        printf("child process [%d] finish,quit!\n",getpid());
                        exit(0);
                }
        }
        else
        {
                //sleep(1);
                //wait();
                while(1)
                {
                        printf("Parrent process [%d] create child [%d] sucess\n",getpid(),child);
                        sleep(1);
                }
        }
        printf("Only parrent do......[%d],count = [%d]\n",getpid(),count);
        return 0;
}

1
0
查看评论

Linux下fork创建进程的一些思考

1. 进程的概念在多道程序环境下,允许多个程序并发执行,此时它们将失去封闭性,并具有间断性及不可再现性的特征。为此引入了进程(Process)的概念,以便更好地描述和控制程序的并发执行,实现操作系统的并发性和共享性。为了使参与并发执行的程序(含数据)能独立地运行,必须为之配置一个专门的数据结构,称为...
  • Gpwner
  • Gpwner
  • 2016-12-22 13:52
  • 698

linux创建进程fork的方法步骤

fork创建进程 函数原型如下 #include// 必须引入头文件,使用fork函数的时候,必须包含这个头文件,否则,系统找不到fork函数 pid_t fork(void); //void代表没有任何形式参数 父进程与子进程 1.掌握概念,什么是父进程,什么是子进程   除了0号进程...
  • lidiya007
  • lidiya007
  • 2016-12-07 18:40
  • 208

fork()是如何创建新进程的

进程,我们一般都把它看做是程序执行的一个实例,是进程实体的运行过程,是系统进行资源分配和调度的一个独立的单位。有产生、有消亡。当一个进程创建时,子进程可以继承父进程所有资源,撤销时,也要归还所有资源。 一、进程描述符        我们一般所说的进程控制块...
  • mightySheldor
  • mightySheldor
  • 2015-04-12 15:03
  • 2141

Linux创建进程的fork()函数

今天总结一下Linux的进程创建,以及需要的系统调用的fork函数,记录一下,作为一个心得吧。         在Linux中,fork函数的功能就是在一个进程中创建一个新的进程,当前调用fork函数的进程就是产生的新进程的父进程...
  • u010727765
  • u010727765
  • 2016-06-30 23:49
  • 752

用fork创建进程树

创建一个如下图所示的进程树。用getpid()和getppid()梳理其关系。 要注意的是fork之后的子进程和父进程共享代码段,并且如果有写的情况下会有各自的数据段。 #include #include #include #include int main(int argc, char *...
  • slowdreamer
  • slowdreamer
  • 2015-05-16 19:53
  • 1363

UNIX进程的创建,进程链和进程扇

进程扇的 例子: /* 由一个进程派生多个子进程 */ #include #include #include int main(void) {         int i;  ...
  • DLUTBruceZhang
  • DLUTBruceZhang
  • 2013-03-10 18:24
  • 2318

Linux C 中vfork和fork的区别

我们知道, fork会创建一个新的进程, 这个新的进程是当前进程的子进程, 区别在于, fork函数会复制父进程的一些资源, 也就是, 仅仅是复制的关系, 而非共享。 而vfork就不同了, 利用vfork创建的子进程和父进程共享地址空间, 下面, 我们通过实际程序来看看:    ...
  • stpeace
  • stpeace
  • 2015-04-02 22:28
  • 2689

linux c之创建进程fork和vfork函数之间的区别

1、函数简介       1)、得到当前的进程id pid_t getpid();       2)、fork函数      ...
  • u011068702
  • u011068702
  • 2017-01-12 20:36
  • 493

Linux进程创建:fork,vfork,exec,clone总结

Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息,包括数据段,代码段,堆栈段的地址,当前进程的环境变量,文件的描述符等,在创建进程的时候,会为进程创建进程描述符。 1.fork系统调用      ...
  • xitongfengxi
  • xitongfengxi
  • 2016-07-22 14:42
  • 485

一个循环里fork出的子进程个数

[lizhe@localhost fork]$ ./exe pid:4071 ------ 问以下代码的执行结果 #include #include #include int main(){ int pid=0; for(int i=0;i<3;i++){ ...
  • lizhe10177
  • lizhe10177
  • 2014-03-17 16:01
  • 1325
    个人资料
    • 访问:61586次
    • 积分:3054
    • 等级:
    • 排名:第13529名
    • 原创:234篇
    • 转载:1篇
    • 译文:0篇
    • 评论:1条
    最新评论