zoukankan      html  css  js  c++  java
  • UNIX C 进程Part2

    1.获取进程ID

    #include <unistd.h>
    
    pid_t getpid(void); //获取子进程id
    pid_t getppid(void);//获取父进程id

    2.获取实际用户ID和实际用户组ID

    #include <unistd.h>
    
    uid_t getuid(void);
    uid_t getgid(void);

    3.有效用户ID和有效组ID

    #include <unistd.h>
    
    uid_t geteuid(void);
    uid_t getegid(void);

    4.进程创建

    #include <unistd.h>
    
    pid_t fork(void);//写时复制方式创建进程,把父进程资源复制到子进程,只要代码区是共享
    这种进程退出方式 --exit(status)
    pid_t vfork(void);//和父进程共享资源
    退出进程函数_exit(status)

    5.进程正常退出

      exit退出处理函数

    #include <stdlib.h>
    
    void exit(int status);
    
    exit退出函数在执行退出函数的时候会做下面三步
    1.检查或执行遗言函数atexit、on_exit
    2.关闭IO流
    3.删除tmpfile函数创建的临时文件

       

      _exit()和_Exit()

    #include <unistd.h>
    
    void _exit(int status);//vfork()相对应的退出函数
    
    
    #include <stdlib.h>
    
    void _Exit(int  status);//和exit函数相似
    退出前处理以下三件事儿
    1.关闭文件描述符
    2.将子进程交给init进程收养
    3.向调用的父进程发SIGCHLD(17)信号

    6.遗言函数

    #include <stdlib.h>
    
    int atexit(void(*function)(void));
        成功返回0,失败非0
    
    int on_exit(void(*function)(int,void*),void* arg);
    成功返回0,失败返回非0
    
    --function:函数指针
    --arg:泛型指针(万能指针),该参数指向function处理函数

    7.异常终止进程

    #include <stdlib.h>
    
    void abort(void);
        不返回
    
    进程解除SIGABRT(6)信号阻塞,然后导致进程阻塞

    8.进程回收处理

      wait

    #include <sys/wait.h>
    
    pid_t wait(int* status);//为子进程收尸,回收系统资源
    
    成功返回子进程ID,失败-1

      

      waitpid

    #include <sys/wait.h>
    
    pid_t pid  = waitpid(pid_t pid,int* status,int option);
        成功返回子进程pid或0,失败返回-1
    
    --pid:可取下值
        < -1 ;等待特定进程组的任意子进程
        -1;等待并回收任意子进程和wait函数一样
        0;回收同进程组的调用进程中任意子进程
        >0;回收特定子进程(由pid标识)
    
    --option:可取下值
        0;阻塞模式,直至子进程终止
        WNOHANG,非阻塞模式,子进程仍在运行返回 0;

    9.exec在一个进程上创建新的进程,但pid会不变

    #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 arg[]);
    int execvp(const char* file,char* const arg[]);
    int execve(const char* path,char* const arg[],char* const envp[]);
    
    --l  即list      字符指针 命令行 列表参数
    --p 即path    根据环境变量中文件
    --e 即env     环境字符指针数组
    --v 即vector  命令行参数

    exec函数,不返回

    10.system函数

    #include <stdlib.h>
    
    int system(const char* command);
    
    --command 命令字符串
  • 相关阅读:
    CAN总线布线规范
    使用make_ext4fs时报错,No such file or directory
    安装arm-2009q3交叉编译器后,执行No such file....
    Busybox下make menconfig报错处理!
    解决Markdown转为PDF后,尖括号不能正确显示问题。
    开发板与PC直连 交叉、直连网线做法
    BusyBox tftp使用
    STM32的flash数据页转存过程分析!
    c语言中log函数的使用!
    POJ 3667 Hotel
  • 原文地址:https://www.cnblogs.com/Kernel001/p/7805836.html
Copyright © 2011-2022 走看看