• 进程的创建


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

    创建一新进程,如果成功创建子进程,总是返回0,子进程的数据不会影响父进程的数据,不过文件相关属性会有影响,例如子进程中修改文件偏移量,父进程中的也跟着变(父进程中用wait或者sleep函数使得子进程得以运行)

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

    创建一个新的子进程,该子进程是为立即执行exec(),成功总是返回0。相对与fork(),vfork()无需为子进程复制虚拟页或页表,相反子进程共享父进程的内存(将会影响父进程数据),在exec()或者_exit()之前,将暂停执行父进程,但是对文件描述符的操作不会影响父进程,而且子进程优先父进程获得cpu使用权,fork()则是父进程优。不过不推荐使用该函数,除非速度绝对重要

    
    void _exit(int status); //status参数定义了进程的终止状态,父进程可调用wait()以获取该状态,0代表成功推出,非0代表异常退出,不刷新stdio缓冲区,不常用,一般用下面的exit()
    int exit(int status);   //return n等同exit(n),刷新stdio缓冲区
    int atexit(void(*func)(void));  //注册退出处理程序
    int on_exit(void(*func)(int,void *),void *arg); //传递俩个参数给func(),提供给exit()的status参数和注册时供给on_exit()的一份arg参数拷贝。该函数可移植性差
    
    #include<sys/wait.h>
    pid_t wait(int *status);//等待调用进程的任一子进程终止,用status返回子进程的终止状态
    pid_t waitpid(pid_t pid,int *status,int options);
    //pid用来表示需要等待的具体子进程,如果pid大于0,表示等待进程为pid的子进程,等于0,等待与父进程同一进程组的所有子进程,小于-1,等待进程组标识符与pid绝对值相等的所有子进程,等于-1,等待任一子进程,options的值如下
    WUNTRACED   除了返回终止子进程的信息外,还返回因信号而停止的子进程信息
    WCONTINUED  返回那些因收到SIGCONT信号而恢复执行的已停止子进程的状态消息
    WNOHANG     如果pid所指定的子进程并未发生状态改变,则立即返回,而不会阻塞

    这里写图片描述

    int waitid(idtype_t idtype,id_t id,siginfo_t *infop,int options);
    若idtype为P_ALL,则等待任何子进程,同时忽略id的值
    如果为P_PID则等待进程idid的子进程
    如果为P_PGID,则等待进程组idid各进程的所有子进程
    options的值可为
    WEXITED 等待已终止的子进程,而无论其是否正常返回
    WSTOPPED 等待已通过信号而停止的子进程
    WCONTINUED 等待经由信号SIGCONT而回复的子进程
    WNOHANG    如果匹配id值的子进程并无状态信息需要返回,则立即返回
    WNOWAIT     执行成功,waitid()返回0,且会更新infop所指向的siginfo_t结构,以包含子进程的相关信息
    
    //参数rusage所指向的结构中返回终止子进程的资源使用情况,包括cpu时间总量,内存管理统计数据
    //如果options中指定了WUNTRACED 选项,则还可以获取到停止子进程的资源使用信息,一般也不怎么用这两个调用
    #include<sys/resource.h>
    #include<sys/wait.h>
    pid_t wait3(int *status,int options,struct rusage *rusage);
    pid_t wait4(pid_t pid,int *status,int options,struct rusage *rusage);

    ```
    #include<unistd.h>
    //丢弃旧程序,执行新程序,pathname新程序路径名
    //argv命令行参数,argv[0]为命令名,argv[1]为第一个参数
    //新程序的环境列表,对应新程序的environ数组
    int execve(const char *pathname,char *const argv[],char *const envp[]);
    int execlp("ls","ls","-l",argv[0],(char *)NULL);//在程序中使用,列出该程序的文件的详细信息,环境列表使用系统环境
    int execl("/bin/sh","sh","-c","ls|wc",(char *)NULL);    //路径,命令名称,选项,命令内容
    
    #include<stdlib.h>
    int system(const char *command);    //执行任意的shell命令,该函数会给系统带来安全隐患
    
    

    “`

  • 相关阅读:
    Node.js:util.inherits 面向对象特性【原型】
    Redbean:入门(二)
    Redbean:入门(一)
    PHP 文件操作函数大全
    Jquer的三种初始化方式
    Php+Redis 实现Redis提供的lua脚本功能
    Redis 五:配置主从复制功能
    Redis 四:存储类型之有序集合
    jQuery选择器总结(转)
    IDEA ECLIPSE Debug 卡住,Run正常
  • 原文地址:https://www.cnblogs.com/biaopei/p/7730609.html
Copyright © 2020-2023  润新知