waitpid

  waitpid(等待子进程中断或结束)
  表头文件
  #include<sys/types.h>
  #include<sys/wait.h>
  定义函数 pid_t waitpid(pid_t pid,int * status,int options);
  函数说明
  waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程
  结束。如果在调用 wait()时子进程已经结束,则 wait()会立即
  返回子进程结束状态值。 子进程的结束状态值会由参数 status 返回,
  而子进程的进程识别码也会一起返回。如果不在意结束状态值,则
  参数 status 可以设成 NULL。参数 pid 为欲等待的子进程识别码,
  其他数值意义如下:
  pid<-1 等待进程组识别码为 pid 绝对值的任何子进程。
  pid=-1 等待任何子进程,相当于 wait()。 
  pid=0 等待进程组识别码与目前进程相同的任何子进程。 
  pid>0 等待任何子进程识别码为 pid 的子进程。
  参数 option 可以为 0 或下面的 OR 组合:
  WNOHANG 如果没有任何已经结束的子进程则马上返回, 不予以等待。
  WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。
  子进程的结束状态返回后存于 status,底下有几个宏可判别结束情况:
  WIFEXITED(status)如果子进程正常结束则为非 0 值。
  WEXITSTATUS(status)取得子进程 exit()返回的结束代码,一般会先用 WIFEXITED 来判断是否正常结束才能使用此宏。
  WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真
  WTERMSIG(status) 取得子进程因信号而中止的信号代码,一般会先用 WIFSIGNALED 来判断后才使用此宏。
  WIFSTOPPED(status) 如果子进程处于暂停执行情况则此宏值为真。一般只有使用 WUNTRACED 时才会有此情况。
  WSTOPSIG(status) 取得引发子进程暂停的信号代码,一般会先用 WIFSTOPPED 来判断后才使用此宏。
  如果执行成功则返回子进程识别码(PID) ,如果有错误发生则返回
  返回值-1。失败原因存于 errno 中。
 
 

 /******
  * waitpid.c - Simple wait usage
  *********/
#include <unistd.h>
  #include <sys/types.h>
  #include <sys/wait.h>
  #include <stdio.h>
  #include <stdlib.h>
  int main( void )
  {
  pid_t childpid;
  int status;
  childpid = fork();
  if ( - == childpid )
  {
  perror( "fork()" );
  exit( EXIT_FAILURE );
  }
  else if ( == childpid )
  {
  puts( "In child process" );
  sleep( );//让子进程睡眠3秒,看看父进程的行为
  printf("\tchild pid = %d\n", getpid());
  printf("\tchild ppid = %d\n", getppid());
  exit(EXIT_SUCCESS);
  }
  else
  {
  waitpid( childpid, &status, );
  puts( "in parent" );
  printf( "\tparent pid = %d\n", getpid() );
  printf( "\tparent ppid = %d\n", getppid() );
  printf( "\tchild process exited with status %d \n", status );
  }
  exit(EXIT_SUCCESS);
  }

  [root@localhost src]# gcc waitpid.c 
  [root@localhost src]# ./a.out 
  In child process
  child pid = 4469
  child ppid = 4468
  in parent
  parent pid = 4468
  parent ppid = 4379
  child process exited with status 0 
  [root@localhost src]# 
  如果将上面“waitpid( childpid, &status, 0 );”行注释掉,程序执行效果如下:
  [root@localhost src]# ./a.out 
  In child process
  in parent
  parent pid = 4481
  parent ppid = 4379
  child process exited with status 1331234400 
  [root@localhost src]# child pid = 4482
  child ppid = 1
  子进程还没有退出,父进程已经退出了。

fork

  fork函数创建子进程,子进程获得父进程数据空间、堆、栈等资源的副本。克隆父进程的代码,克隆代码的执行位置
        注意父子进程是同时执行的
      
   1.父进程先退出,子进程就依托根进程init:孤儿进程。
    孤儿进程没有任何危害
       2.子进程先退出
          子进程会成为僵尸进程。僵尸进程不会占用内存,cpu
   僵尸进程造成进程名额资源浪费
       3.僵尸进程使用wait回收
       4.父进程怎么知道进程退出?
          子进程结束通常会向父进程发送一个信号SIGCHLD或17
        5.父进程处理子进程退出信号
           signal(int sig,void(*)(int));
          系统注册,只要sig信号发生,系统停止进程
           当函数执行完毕,继续原来进程
           5.1 实现处理函数
           5.2使用signal绑定信号函数
         6.父子进程的资源访问
            6.1内存资源
    映射内存:
                             mmap(0, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS |MAP_SHARED,0, 0);
                           MAP_SHARED:映射到同一物理内存
                             MAP_PRIVATE:映射到不同物理内存
             6.2文件资源
         两个进程之间,文件描述符号指向的时候同一个文件内核数据结构
          7.多进程与文件锁(建议锁)
 
   
 
       fork()函数,Linux系统调用
  头文件:
  #include <unistd.h>
  函数定义:
  int fork( void );
  返回值:
   子进程中返回0,子进程不调用fork()所以是0
       父进程中返回子进程ID,
       出错返回-1
  函数说明:
  一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。
  子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。
      注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间,它们之间共享的存储空间只有代码段。
  示例代码:
  

   #include <unistd.h>
  #include <stdio.h>
  int main(int argc, void ** argv )
  {
  int pid = fork();
  if(pid < ) {
  // print("error!");
  } else if( pid == ) {
  // print("This is the child process!");
  } else {
  // print("This is the parent process! child process id = %d", pid);
  }
  return ;
  }

execlp

  execlp(从PATH 环境变量中查找文件并执行)
 
      1.execl不会创建新的进程
    2.execl替换当前进程的代码。如果替换成功,execl之后的代码,将不会执行
      3.execl和execlp的区别
          execl指当前路径,必须要写出指令的相对路径或者绝对路径
          execlp使用系统的搜索路径(which能找到的指令都能执行)
       
  相关函数:
  fork,execl,execle,execv,execve,execvp
  表头文件:
  #include<unistd.h>
  定义函数:
  int execlp(const char * file,const char * arg,……)
   第一个参数 文件的路径
         第二参数  指令的名字
          .....      指令的参数
  函数说明:
  execlp()会从PATH 环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,
      然后将第二个以后的参数当做该文件的argv[0]、argv[1]……,
     最后一个参数必须用空指针(NULL)作结束。
  返回值:
  如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。
  错误代码 参考execve()。
  范例:
  

   /* 执行ls -al /etc/passwd execlp()会依PATH 变量中的/bin找到/bin/ls */
  #include<unistd.h>
  main()
  {
  execlp(“ls”,”ls”,”-al”,”/etc/passwd”,(char *));
  }

  执行:
  -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
  ————————————————————————————————add by love_aiqiu
  NAME
  execl, execlp, execle, execv, execvp - execute a file
  SYNOPSIS
  #include <unistd.h>
  extern char **environ;
  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[]);

Linux环境编程--waitpid与fork与execlp的更多相关文章

  1. Linux环境编程相关的文章

    Linux环境编程相关的文章 好几年没有接触Linux环境下编程了,好多东西都有点生疏了.趁着现在有空打算把相关的一些技能重拾一下,顺手写一些相关的文章加深印象. 因为不是写书,也受到许多外部因素限制 ...

  2. Linux 环境编程:dirfd参数 有关解析

    背景 在Unix环境编程中,系统提供了很多以at结尾的函数,如openat.fstatat等,而这类函数通常有一个特点,就是形参列表中多了int dirfd 例如: int open(const ch ...

  3. Linux环境编程进程间通信机制理解

    一.Linux系统调用主要函数 二.创建进程 1.创建子进程系统调用fork() 2.验证fork()创建子进程效果 3.系统调用fork()与挂起系统调用wait() 三.模拟进程管道通信 四.pi ...

  4. 笔记整理:计算CPU使用率 ----linux 环境编程 从应用到内核

    linux 提供time命令统计进程在用户态和内核态消耗的CPU时间: [root@localhost ~]# time sleep real 0m2.001s user 0m0.001s sys 0 ...

  5. Linux环境编程导引

    计算机系统硬件组成 总线 贯穿整个系统的一组电子管道称为总线, 分为: 片内总线 系统总线 数据总线DB 地址总线AB 控制总线CB 外部总线 I/O设备 I/O设备是系统与外界联系的通道 键盘鼠标是 ...

  6. 【Linux环境编程】获取网卡的实时网速

    在windows以下.我们能够看到360或者是qq安全卫士的"安全球".上面显示实时的网速情况.那么在linux里面怎样获取网卡的实时网速?事实上原理非常easy,读取须要获取网速 ...

  7. Linux环境编程之共享内存区(一):共享内存区简单介绍

    共享内存区是可用IPC形式中最快的.一旦内存区映射到共享它的进程的地址空间,进程间数据的传递就不再涉及内核.然而往该共享内存区存放信息或从中取走信息的进程间通常须要某种形式的同步.不再涉及内核是指:进 ...

  8. Linux环境编程之同步(二):条件变量

    相互排斥锁用于上锁,条件变量则用于等待.条件变量是类型为pthread_cond_t的变量.一般使用例如以下函数: #include <pthread.h> int pthread_con ...

  9. Linux环境编程之同步(四):Posix信号量

    信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语.有三种类型:Posix有名信号量,使用Posix IPC名字标识.Posix基于内存的信号量,存放在共享内存区中:System ...

随机推荐

  1. centos中JDK版本冲突的问题

    在centos环境下,我JDK版本安装了jdk6,jdk7.系统还自带了一个JDK7. 我在查看JDK版本是,发现不是我在/etc/profile中配置的. 1:which java 查看Java的命 ...

  2. java全栈day10--接口 多态

    接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的定义与 ...

  3. Spring @ResponseBody 返回乱码 的优雅解决办法

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 返回的结果中,中文全部被问号(?)代替的解决办法: *-servlet.xml的部分配置如下: <bean id=&quo ...

  4. Java的post请求-----接口测试

    本次主要是对登陆的接口测试post请求,希望记录在博客里面,一点一点的成长. package com.ju.Login; import java.io.BufferedReader; import j ...

  5. 关于C#中的算术运算

    使用中间变量交换两个int型变量的值: ; ; a = a+b; b = a-b; a = a-b; 相信大家很容易写出来,但考虑到边界值情况时会有一些有趣的事情. 我们知道有一个int.MaxVal ...

  6. ssh 免密码远程登录

    背景: 公司有两台服务器A与B,经常会碰到代码中的配置文件不一致的情况...............,为了反面让两台服务器配置统一,所以需要写个shell脚本,用到的linux命令主要是scp 1.在 ...

  7. Nodejs 文档概览

    Node.js v8.11.1 Node.js v8.11.1 文档 今天大致浏览了一下Node.js的官方文档,走马观花的了解了大部分模块的api,对他们的使用场景做一个简单的笔记 assert 断 ...

  8. iOS自定义相机

    1.首先声明以下对象 #import <AVFoundation/AVFoundation.h> //捕获设备,通常是前置摄像头,后置摄像头,麦克风(音频输入) @property (no ...

  9. forEach时候删除数组某一属性项,使用splice容易出现问题

    第一次forEach循环,index是0,item是1 ,arr是[1,1,2], if条件成立,使用splice最终的arr是[1,2] 第二次循环,index是1,item是2,arr是[1,2] ...

  10. 树链剖分【洛谷P2590】 [ZJOI2008]树的统计

    P2590 [ZJOI2008]树的统计 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把 ...