c语言系统函数——进程的创建

摘要:
创建的子进程将替换父进程并占用父进程的pid。

一 、 进程的创建

    1.fork();创建一个独立的进程
      pid_t fork(void);
      使用这个命令会创建一个独立于父进程而且拷贝父进程全部存储空间的子进程
      返回值有三种情况
              1.父进程会返回子进程的进程号,pid>0
              2.子进程会返回0;pid = 0 ;
              3.出错会返回-1 ; pid = -1;
        使用模板:
          if(pid > 0)
          {
              //父进程要执行的语句    
          }
          else if(pid == 0)
          {
              //子进程的语句
          }
          else
          {
             //出错的语句。
          }
    
        获得本进程的pid getpid();
        获得父进程的pid getppid();
        
        如果父进程结束了而子进程并没有结束,子进程就会变成孤儿进程,最后由inti()回收
        如果子进程技术而父进程没有结束,子进程将会变成僵尸进程,必须由父进程主动回收。
        
        父进程回收子进程,使用函数wait(),父进程会等待子进程接受才会继续执行
        如果父进程不想主动释放子进程可以使用一级缓冲
        A  -- > fork --          -- wait
                  B  --  fork    --     //子进程在在建立一个进程,让真正程序为孤儿进程,使用init来回收
                            C      --  end
                            
                            
    2.使用exec函数族
       int execl(const char *path, const char *arg, ...);
       int execlp(const char *file, const char *arg, ...);
       int execle(const char *path, const char *arg,
                  ..., char * const envp[]);
       int execv(const char *path, char *const argv[]);
       int execvp(const char *file, char *const argv[]);
       int execvpe(const char *file, char *const argv[],
                  char *const envp[]);
       函数返回:只有错误的时候才会返回-1,如果函数正确进程将会被替换。
       
     创建的子进程将会替代父进程,占用父进程的pid。
     execl(),中第一参数是想要执行程序的路径,下面的是要执行程序的参数,结尾应为NULL ls -a -l,有三个参数
     execlp(),从环境变量中找文件执行,其他的为可变参数,结束为NULL
     execle(),从一个环境变量数组中寻找程序执行,必须传入一个环境变量的数组
     下面的三个是传入字符串数组,而不是一个一个单独的字符串。
        
        
 例题:1.父子进程一个向文件中写数据,一个计算文件的大小

    2.调用系统提供的程序,仿写终端。
   

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int readFromSTDIN(char * p,int count);
//从标准输入获取字符串。
void split2(char *s,char d,char *r[5]);
//分割字符串。

int main()
{    
    //定义一个数组,用来存储参数
    //参数的个数是不确定的,如何获取不一样的
    //从标准输入调用系统函数获取字符串,获取包括换行和空格。
    //使用strchr和strncpy,分割字符
    
    char caCmd[256] ={'

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇NFS未授权访问VM10虚拟机安装图解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

linux kernel的cmdline參数解析原理分析

利用工作之便,今天研究了kernel下cmdline參数解析过程。记录在此。与大家共享。转载请注明出处。谢谢。 Kernel 版本:3.4.55 Kernel启动时会解析cmdline,然后依据这些參数如console root来进行配置执行。 Cmdline是由bootloader传给kernel。如uboot。将须要传给kernel的參数做成一个...

10分钟学会React Context API

Create-react-app来学习这个功能: 注意下面代码红色的即可,非常简单. 在小项目里Context API完全可以替换掉react-redux. 修改app.js import React, { lazy, useState } from "react"; import { Button } from 'antd'; import { Hash...

Qt Meta Object System-元对象系统

研一的时候开始使用Qt,感觉用Qt开发图形界面比MFC的一套框架来方便的多。后来由于项目的需要,也没有再接触Qt了。现在要重新拾起来,于是要从基础学起。 Now,开始学习Qt事件处理机制。 元对象系统的构成 QObject为所有需要利用元对象系统的对象提供一个基类。 Q_OBJECT宏,在类的声明体内激活meta-object功能,比如动态属性、信号和槽...

Windows注册表基础代码

Windows下对注册表进行操作使用的一段基础代码Reg.h: #pragmaonce#include<assert.h>#include<windows.h>classReg{HKEYhkey;public:voidopen(HKEYroot,char*subKey);//打开注册表键,不存在则创建voiddel(HKEYroot...

Oracle 时间差计算

两个Date类型字段:START_DATE,END_DATE,计算这两个日期的时间差(分别以天,小时,分钟,秒,毫秒): 天: ROUND(TO_NUMBER(END_DATE - START_DATE)) 小时: ROUND(TO_NUMBER(END_DATE - START_DATE) * 24) 分钟: ROUND(TO_NUMBER(END_DA...

转:程序内存空间(代码段、数据段、堆栈段)

https://blog.csdn.net/ywcpig/article/details/52303745 在冯诺依曼的体系结构中,一个进程必须有:代码段,堆栈段,数据段。 进程的虚拟地址空间图示如下: BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Sym...