• apue学习笔记(第八章 进程控制)


    本章介绍UNIX系统的进程控制,包括创建新进程、执行程序和进程终止。

    进程标识

    每一个进程都有一个非负整数表示的唯一进程ID,除了进程ID,每个进程还有一些其他标识符。下列函数返回这些标识符

    #include <unistd.h>
    pid_t getpid(void);
    pid_t getppid(void);
    uid_t getuid(void);
    uid_t geteuid(void);
    gid_t getgid(void);
    gid_t getegid(void);

    函数fork

    一个现有的进程可以调用fork函数创建一个新进程

    #include <unistd.h>
    pid_t fork(void);

    由fork创建的新进程被称为子进程。fork函数被调用一次,但是返回两次

    子进程的返回值是0,父进程的返回值则是新建子进程的进程ID。

    fork之后是父进程还是子进程先执行是不确定的,这取决于内核所使用的调度算法。

    子进程和父进程继续执行fork调用之后的指令,子进程获得父进程数据空间、堆和栈的副本。注意,父子进程并不共享这些存储空间部分,只共享正文段。

    函数vfork

    vfork函数用于创建一个新进程,而该新进程的目的是exec一个新程序。

    vfork与fork一样都创建一个子进程,但是它并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec(或exit)。

    不过在子进程调用exec或exit之前,它在父进程的空间中运行。

    vfork和fork之间的另一个区别是:vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行。

    函数wait和waitpid

    #include <sys/wait.h>
    pid_t wait(int *statloc);
    pid_t waitpid(pid_t pid,int *statloc,int options);

    这两个函数的区别如下:

    在一个子进程终止前,wait使其调用者阻塞,而waitpid有一选项,可使调用者不阻塞。

    waitpid并不等待在其调用之后的第一个终止子进程,它有若干个选项,可以控制它所等待的进程。

    对于waitpid函数中pid参数的作用解释如下:

    pid==-1  等待任一子进程。与wait等效

    pid>0  等待进程ID与pid相等的子进程

    pid==0  等待组ID等于调用进程组ID的任一子进程

    pid<-1  等待组ID等于pid绝对值的任一子进程

    options参数使我们进一步控制waitpid的操作。此参数或者是0,或者是下图中常量按位或运算的结果

    函数exec

    有7种不同的exec函数可供使用,当进程调用一种exec函数时,该进程执行的程序完全替换成新程序。

    #include <unistd.h>
    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[]);
    int fexecve(int fd,char *const argv[],char *const envp[]);

    path指定路径名为参数,当指定file作为参数时:

    1 如果file中包含/,则就将其视为路径名

    2 否则就按PATH环境变量,在它指定的各目录中搜寻可执行文件

    7个exec函数之间的区别

    这7个函数只有execve是内核的系统调用。另外6个只是库函数,最终都要调用该系统调用。下图是这7个函数之间的关系

     函数system

    #include <stdlib.h>
    int system(coast char *cmdstring);
  • 相关阅读:
    发送邮件封装的方法
    异步编程
    Xaml中string(字符串)常量的定义以及空格的处理
    python中lxml的应用
    Python打包成exe
    利用TaskScheduler处理Queue、Stack等类型的操作队列(生产者消费者场景)
    TreeView的性能问题
    WPF中ItemsControl绑定到Google ProtocolBuffer的结构体时的性能问题
    WPF中ToolTip的自定义
    WPF中ItemsControl绑定到Google ProtocolBuffer的结构体时的性能问题
  • 原文地址:https://www.cnblogs.com/runnyu/p/4638913.html
Copyright © 2020-2023  润新知