数据结构 1 进程

一.创建子进程

pid_t pid=fork()

2.特点

  • 两个返回值

     -父进程:返回子进程的pid
     -子进程:返回值为0
    
  • 父子进程的执行属性是随机的(执行顺序)

  • 子进程代码从父进程执行到的位置开始执行

  • 父子进程数据永远一样吗?

     -	1 fork完成之后一样
     -  2 有血缘关系的进程,读时共享,写时复制。
    

二常用函数

getpid()
getppid()

执行指定目录下的程序:

execl(const char path,const char* arg…)

  • path : 要执行的程序的绝对路径
  • 变参arg:要执行程序的参数
  • 第一arg:占位 //随便写
  • 后面的arg:命令的参数
  • 参数写完后加NULL
  • 一般执行自己写的程序
执行PATH 环境变量能够搜索到的程序

execp(const char* file , const char* arg…)

  • file:执行的命令名
  • 第一arg:占位
  • 后面的arg:命令的参数
  • 参数写完后: NULL
  • 执行系统的自带程序
    • //当执行自定义的程序时 file用绝对路径

三进程的回收

  • wait 阻塞函数

  • 当子进程死后 wait回收子进程的pcb

      	- int status
     		- pid_t wait(&status)    **//调用一次,回收一个子进程资源**
      			-  回收多个子进程时 while循环
      			- 返回return 0 返回的值
     		- 
    
  • 返回值

    • >0:回收的子进程pid

    • -1:没有子进程可以回收

    • status --传出参数

      • 获取退出时候的返回值 //正常返回

        • 返回return 0 ;中的0 或 exit(1) 中的 0
        • WIFEXITED(status)
        • WEXITSTATUS(status)
      • 被信号杀死

      • WIFSIGNALED(status)
      • WTERMSIG(status)

删除线格式

示例

if(pid>0){
		printf("father ... pid=%d\tppid=%d\n",getpid(),getppid());
		int status;
		pid_t wpid=wait(&status);
		//判断是否正常退出
		if(WIFEXITED(status)){
			printf(" exit value : %d\n  ",WEXITSTATUS(status));
		}
		//判断是否被信号杀死
		if(WIFSIGNALED(status)){
			printf(" by signal : %d\n  ",WTERMSIG(status));
		}
		printf("died child pid=%d\n",wpid);
	}

你可能感兴趣的:(c语言)