首页 > 社交 > 科普中国

Linux那些被你忽略的知识点

常驻编辑 科普中国 2022-09-19 进程   知识点   线程   函数   信号   参数   结束   文件   程序   系统   资源
  • CLONE_SIGHAND 子进程与父进程共享相同的信号处理(signal handler)表
  • CLONE_PTRACE 若父进程被trace,子进程也被trace
  • CLONE_VFORK 父进程被挂起,直至子进程释放虚拟内存资源
  • CLONE_VM 子进程与父进程运行于相同的内存空间
  • CLONE_PID 子进程在创建时PID与父进程一致
  • CLONE_THREAD Linux 2.4中增加以支持POSIX线程标准,子进程与父进程共享相同的线程群
  • 例子:
      #include   
      #include   
      #include   
      #include   
      #include   
      #include   
      #include  
     
      int variable,fd; 
     
      int do_something(){ 
      variable = 42;   
      printf("in child process
    ");   
      close(fd);   
      return 0;  
      } 
     
      int main(int argc, char *argv[]){ 
      void *child_stack;  
      char tempch; 
     
      variable = 9; 
     
      fd = open("/test.txt",O_RDONLY);  
      child_stack = (void *)malloc(16384);
    
      printf("The variable was %d
    ",variable); 
     
      clone(do_something, child_stack+10000, CLONE_VM |CLONE_FILES,NULL); 
     
      sleep(3); /* 延时以便子进程完成关闭文件操作、修改变量 */ 
     
      printf("The variable is now %d
    ",variable); 
     
      if(read(fd,&tempch,1) < 1){ 
      perror("File Read Error");  
      exit(1);  
       } 
     
      printf("We could read from the file
    ");  
      return 0;  
      } 
      运行结果: 
      the value was 9  
      in child process  
      The variable is now 42  
      File Read Error

    sleep函数

    进程挂起指定的秒数,直到指定的时间用完或者收到信号才解除挂起。注意:进程挂起指定的秒数后程序并不会立即执行,系统只是将此进程切换到了就绪态。ANu拜客生活常识网

    wait函数

    工作原理:ANu拜客生活常识网

    父进程调用wait函数后阻塞,子进程结束时,系统向其父进程发送SIGCHILD信号。父进程被SIGCHILD信号唤醒然后去回收僵尸子进程,父子进程之间是异步的,SIGCHILD信号机制就是为了解决父子进程之间的异步通信问题,让父进程可以及时的去回收僵尸子进程。若父进程没有任何子进程则wait返回错误。当前进程有可能有多个子进程,wait函数阻塞直到其中一个子进程结束wait就会返回,wait的返回值就可以用来判断到底是哪一个子进程本次被回收了。ANu拜客生活常识网

    pid_t wait(int *status);
    功能:等待子进程终止,如果终止了,此函数会回收子进程的资源。调用wait函数的进程会挂起,直到它的一个子进程退出或收到一个不能被忽视的信号时才被唤醒。
      若调用进程没有子进程或它的子进程已经结束,该函数立即返回。
    参数:函数返回时,参数status中包含子进程退出时的状态信息。子进程的退出信息在一个int中包含了多个字段,用宏定义可以取出其中的每个字段。
    返回值:如果执行成功则返回子进程的进程号,出错返回-1,失败原因存于errno中。
    1、WIFEXITED(status) 这个宏用来指出子进程是否为正常退出的,如果是,它会返回一个非零值。
    2、WEXITSTATUS(status) 当WIFEXITED返回非零值时,我们可以用这个宏来提取子进程的返回值,如果子进程调用exit(5)退出,WEXITSTATUS(status) 就会返回5;如果子进程调用exit(7),WEXITSTATUS(status)就会返回7。请注意,如果进程不是正常退出的,也就是说, WIFEXITED返回0,这个值就毫无意义。

    waitpid函数

    pid_t waitpid(pid_t pid, int *status,int options)
    - pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。
    - pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样。
    - pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。
    - pid<-1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值。
    
    options提供了一些额外的选项来控制waitpid,参数option可以为0或可以用"|"运算符把它们连接起来使用,比如:ret=waitpid(-1,NULL,WNOHANG | WUNTRACED);
    如果我们不想使用它们,也可以把options设为0,如:ret=waitpid(-1,NULL,0);
    - WNOHANG 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若结束,则返回该子进程的ID。
    - WUNTRACED 若子进程进入暂停状态,则马上返回,但子进程的结束状态不予以理会。WIFSTOPPED(status)宏确定返回值是否对应于一个暂停子进程。    

    相关阅读:

  • 进程有哪些(查看进程)
  • 如何查看进程(应用程序进程)
  • 如何结束进程(笔记本电脑卡了怎么结束程序)
  • 怎么结束进程 怎么结束正在运行的程序?
  • liunx中jar包启动脚本
  • 北方体验版夏天结束 全国入夏进程图告诉你哪里是真正
  • 今年来最强降雨过程来袭 这份降雨进程图请收好
  • 怎么软化已经硬化的动脉血管?生活中做好这几点,或会有所
  • 从通用的协议栈层面来优化Redis性能的实践
  • 臭氧推动南大洋变暖进程的能力被低估
    • 网站地图 |
    • 声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不做权威认证,如若验证其真实性,请咨询相关权威专业人士。