fork创建进程

原创 2015年11月18日 23:17:16
#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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

创建守护进程为何fork两次

我们先来了解一下什么是守护进程?守护进程 守护进程也称精灵进程(Daemon) 它是运⾏在后台的⼀种特殊进程。它独⽴于控制终端并且周期性地执⾏某种任务或等待处理某些发⽣的事件。守护进程是⼀种...

python中使用fork创建新的进程

python中如果要创建新进程的话,可以使用os模块中的fork方法。为了了解其中工作原理,笔者结合linux的查看进程ps命令,对这个方法做了一些测试。 python运行时进程 pyth...

关于fork创建子进程的疑问

gdgn_526345 发表于 2009-11-25 14:54 linux 创建进程函数fork()返回值的疑问 linux创建进程函数fork()正确调用一次的时候有两个返回值: 子进程返回...

linux下fork函数创建进程

有3个进程,其中一个为父进程,其余两个是该父进程创建的子进程,其中一个子进程运行“ls -l”指令,另一个子进程在暂停5s后异常退出。父进程先用阻塞方式等待第一个进程的结束,然后用非阻塞方式等待另一...

创建守护进程为什么fork两次

守护进程(daemon进程)是后台守护进程,有时候也叫精灵进程(agent).linux 下server都是daemon进程。 其特点是:   1)其父进程是一号进程,通常以d结尾   2)在后...

创建守护进程以及为什么fork两次

守护进程守护进程也叫精灵进程(Daemon),它在后台运行,独立于控制终端并周期性地执行某种任务或等待某些事情发生,一般用于C/S 服务中,在服务端监听端口,等待客户端的连接,如果有客户端发出连接,则...

Linux进程创建三——fork、vfork、clone、kernel_thread

前言Linux创建线程的API主要有fork、vfork、clone、kernel_thread,最终都调用了do_fork。 do_fork的具体流程在上一篇已经分析完毕Linux进程创建二——d...

fork()函数-创建子进程

fork(): The fork() system call will spawn a new child process which is an identical process to ...

fork与vfork创建进程的区别

进程创建的方式: (1)fork函数 (2)vfork函数 fork函数 头文件:#include 函数原型:pid_t fork(void); 返回值:创建成功子...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)