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. python3-字典中的一些常用方法

    # Auther: Aaron Fan #在dict_dict字典中包含字典那个脚本里介绍了这个方法的用法:'''print(av_catalog.setdefault('大陆',{'www.baid ...

  2. 初识 Redis

    浏览目录 什么是redis redis的特点 redis的安装和基本使用 操作模式 连接池 操作 string操作 hash操作 list操作 什么是Redis? redis是一个key-value存 ...

  3. java全栈day34---表单CSS

    今日内容介绍 1 使用html的表单标签编写“注册页面” 2 使用DIV和CSS重写网站首页 所有的html标签中,表单标签是最重要的.在实际开发中,最经典的实例就是用户注册,覆盖 了表单标签的所有的 ...

  4. [译]Javascript中的for循环

    本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...

  5. c++ 类成员变量初始化总结

    最近在学习c++,不同类型的c++成员变量在初始化的时候也有很有的区别,查了一些资料之后再此记录一下: #include<iostream> using namespace std; // ...

  6. SQL Server之XML PATH()

    )='SYS20130228000000012'; SELECT ',' + MedicineTypeID FROM Dic_Res_StoreToType b WHERE b.MedicalInst ...

  7. C#单例---饿汉式和懒汉式

    单例模式: 步骤: 1.定义静态私有对象 2.构造函数私有化 3.定义一个静态的,返回值为该类型的方法,一般以Getinstance/getInit为方法名称 单例模式有懒汉和饿汉,最好使用饿汉 1. ...

  8. Python2闭包问题

    Python2 中的闭包比较怪异,和javascript中的闭包不大一样,这里说明一下. 不少内容引自http://www.cnblogs.com/vamei/archive/2012/12/15/2 ...

  9. linux文件链接

    我的github,欢迎关注,分享知识与技术 链接:一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法. Linux中包括两种链接:硬链接(HardLink)和软链接(Soft Link), ...

  10. 「BZOJ 1831」「AHOI 2008」逆序对「贪心」

    题意 给定一个长度为\(n\),值域为\([1,k]\),某些位置不确定的数组,求最小的逆序对.\(n\leq 10^4, k \leq 100\) 题解 这题有人用前缀和优化\(dp\)过了,但是这 ...