zoukankan      html  css  js  c++  java
  • 11进程

    这节主要讲一个系统调用:fork

    pid_t fork(void);

    功能是:创建一个子进程
    返回值:
    如果成功创建一个子进程,对于父进程来说返回子进程ID
    如果成功创建一个子进程,对于子进程来说返回值为0
    如果为-1表示创建失败
    注意:这里是一个程序具有了两个返回值。
    如果父进程先退出,子进程还没退出那么子进程的父进程将变为init进程。(注:任何一个进程都必须有父进程)这是子进程就成为了孤儿进程。
    如果子进程先退出,父进程还没退出,那么子进程必须等到父进程捕获到了子进程的退出状态才真正结束,否则这个时候子进程就成为僵尸进程。
    这里我们献上一个小例子供大家运行理解:
    #include <unistd.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    
    #include <stdlib.h>
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
    #include <signal.h>
    
    #define ERR_EXIT(m) 
    	do 
    	{ 
    		perror(m); 
    		exit(EXIT_FAILURE); 
    	} while(0)
    
    int main(int argc, char *argv[])
    {
    	signal(SIGCHLD, SIG_IGN);//这个信号量可以防止产生僵尸进程
    	printf("before fork pid = %d
    ", getpid());
    	pid_t pid;
    	pid = fork();
    	if (pid == -1) //创建进程失败
    		ERR_EXIT("fork error");
    
    	if (pid > 0)    //父进程中返回子进程的pid
    	{
    		//这是在父进程空间里执行
    		printf("this is parent pid=%d childpid=%d
    ", getpid(), pid);
    		sleep(100);
    	}
    	else if (pid == 0) //返回0就是在子进程的空间里运行了
    	{
    		printf("this is child pid=%d parentpid=%d
    ", getpid(), getppid());
    	}
    	return 0;
    }
    

    虽然注释很多了但是也要简单的介绍一下:

    首先这是一个多组合的例子:

    1、可以去掉signal信号量和sleep(100),看一下程序的运行结果,主要看相关进程号的打印。有可能父进程先结束。

    2、在父进程里边加上一个sleep(1),试看一下进程号的打印,肯定会不同。

    3、加上signal的目的就是为了防止僵尸进程的产生。具体会在信号量哪一节讲到。(特备注意)

  • 相关阅读:
    设计模式7—装饰者模式【结构型】
    设计模式6—命令模式【行为型】
    vue工程类型—vue 多模块、vue多项目集成工程
    设计模式5—迭代器模式【行为型】
    设计模式4—代理模式【结构型】
    设计模式3—策略模式【行为型】
    用户权限管理系统(后台权限管理)
    https原理 及 证书
    设计模式2—单例模式【创建型】
    设计模式1—发布订阅者模式【行为型】
  • 原文地址:https://www.cnblogs.com/DamonBlog/p/4370540.html
Copyright © 2011-2022 走看看