zoukankan      html  css  js  c++  java
  • APUE 学习笔记(六) 进程控制

    1. fork 创建新进程

    fork创建的新进程称为子进程,fork函数调用一次,返回两次。
    两次返回的唯一区别就是子进程的返回值是0,而父进程的返回值是新子进程的进程ID
    在fork之后是父进程先执行还是子进程先执行是不确定的,这取决于内核的调度算法
     
    fork的一个特性就是父进程的所有打开文件描述符都被复制到子进程中,父子进程的每个相同的打开描述符共享一个文件表项
     
    在fork之后处理文件描述符有两种常见情况:
    (1)父进程等待子进程完成。在这种情况下,父进程无需对其描述符做任何处理,因为子进程读写共享描述符的文件偏移量已经执行了相应更新
    (2)父子进程各自执行不同的程序段。在这种情况下,在fork之后,父子进程各自关闭它们不需要使用的文件描述符,常见于网络服务进程
     
    一个已经终止,但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息,释放它仍占用的资源)的进程被称为 僵死进程
     

    2. wait和waitpid函数

    当一个进程正常或异常终止时,内核向其父进程发送SIGCHLD信号,子进程终止是异步事件(可以在父进程运行的任何时候发生),这个信号也就是异步通知
    调用wait或waitpid时,如果其所有子进程都还在运行,那么调用会阻塞
    waitpid函数中,如果pid == -1 那么等待任一子进程,相当于wait函数;如果pid > 0 ,那么等待其进程ID与pid相等的子进程
     

    3.exec函数

    调用exec并不创建新进程,前后的进程ID并未改变,只是用一个全新的程序替换了当前程序
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char* argv[])
    {
        extern char** environ;
        for (int i = 0; i < argc; ++i) {
            fprintf(stdout, "argv[%d] : %s
    ", i, argv[i]);
        }
        for (char** ptr = environ; *ptr != NULL; ++ptr) {
            fprintf(stdout, "%s
    ", *ptr);
        }
        return 0;
    }

    4.进程时间

    clock_t times(struct tms *buf);
    struct tms {
        clock_t tms_utime;    /* user time */
        clock_t tms_stime;    /* system time */
        clock_t tms_cutime;  /* user time of children */
        clock_t tms_cstime;  /* system time of children */
    };
  • 相关阅读:
    Oracle 的日期类型
    简单的同步Socket程序服务端
    MMORPG中的相机跟随算法
    使用了UnityEditor中的API,打包时却不能打包UnityEditor的问题
    C# 中的关键字整理
    Unity3D C#中使用LINQ查询(与 SQL的区别)
    C# 值类型与引用类型的异同
    Unity3D NGUI事件监听的综合管理
    Unity3D 动画状态机简单控制核心代码
    Unity3D判断触摸方向
  • 原文地址:https://www.cnblogs.com/wwwjieo0/p/3714780.html
Copyright © 2011-2022 走看看