zoukankan      html  css  js  c++  java
  • 进程id

    我们知道怎么通过fork函数创建(或者说是复制)一个进程,但是我们要怎么样操作这个被创建出来的进程呢?那就需要用到他的进程id,所以就要获取进程id,一下提供一些获取进程id的函数和其使用方法。
      


    1)getpid和gteppid

    s

    #include <sys/types.h>
    #include <unistd.h>
    
    pid_t getpid(void); //返回调用进程的PID号
    pid_t getppid(void); //返回调用进程父进程的PID号
    
    例子:
    
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/types.h>
    
    int main(void)
    {
    pid_t pid;
    
    printf("this is a test
    ");
    /*
    *上面的语句如果没有
    那么就会在子进程中也打印一句
    *这个是由于printf的机制造成的,遇到
    就出栈,
    *若没有
    那么会在执行下一条语句的时候前出栈,
    *而下一条语句是fork,此时已经复制主进程的环境,其中包括打印
    */
    pid = fork();//调用fork时,子进程会从下面的语句开始执行
    
    if(pid > 0)
    {
    while(1)
    {
    printf("I am parent
    ");
    printf("parent's pid id %d
    ",getpid());
    printf("parent's father is %d
    
    ",getppid());
    sleep(2);
    }
    }
    else if(pid == 0)
    {
    while(1)
    {
    printf("I am child
    ");
    printf("child's pid id %d
    ",getpid());
    printf("child's father is %d
    
    ",getppid());
    sleep(2);
    }
    }
    else
    {
    perror("fork");
    exit(1);
    }
    
    return 0;
    }

    输出结果:

    this is a test
    I am parent
    parent's pid id 4040
    parent's father is 3348

    I am child
    child's pid id 4041
    child's father is 4040

    I am parent
    parent's pid id 4040
    parent's father is 3348

    I am child
    child's pid id 4041
    child's father is 4040

    2)getuid和geteuid

    概念补充:
    1、实际用户ID和实际用户组ID:标识我是谁。也就是登录用户的uid和gid,比如我的Linux以simon登录,在Linux运行的所有的命令的实际用户ID都是simon的uid,实际用户组ID都是simon的gid(可以用id命令查看)。

    2、有效用户ID和有效用户组ID:进程用来决定我们对资源的访问权限。一般情况下,有效用户ID等于实际用户ID,有效用户组ID等于实际用户组ID。当设置-用户-ID(SUID)位设置,则有效用户ID等于文件的所有者的uid,而不是实际用户ID;同样,如果设置了设置-用户组-ID(SGID)位,则有效用户组ID等于文件所有者的gid,而不是实际用户组ID。

    #include <unistd.h>
    #include <sys/types.h>

    uid_t getuid(void); //返回实际用户ID
    uid_t geteuid(void); //返回有效用户ID

    例子:

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    
    /*
    uid_t getuid(void); //返回实际用户ID
    uid_t geteuid(void); //返回有效用户ID
    */
    int main(void)
    {
    printf("实际用户ID = %d
    ",getuid());
    printf("有效用户ID = %d
    ",geteuid());
    
    return 0;
    }


    输出结果:

    实际用户ID = 1000
    有效用户ID = 1000

    3)getgid和getegid

    #include <unistd.h>
    #include <sys/types.h>
    gid_t getgid(void); //返回实际用户组ID
    gid_t getegid(void); //返回有效用户组ID

    例子:

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    
    /*
    gid_t getgid(void); //返回实际用户组ID
    gid_t getegid(void); //返回有效用户组ID
    */
    int main(void)
    {
    printf("实际用户组ID = %d
    ",getgid());
    printf("有效用户组ID = %d
    ",getegid());
    
    return 0;
    }

    输出结果:

    实际用户组ID = 1000
    有效用户组ID = 1000

  • 相关阅读:
    突然想谈谈——我的软件测试入门
    js+rem动态计算font-size的大小,适配各种手机设备!
    iOS 如何打测试包,直接给测试人员使用(绝对的新手入门)
    去掉无用的多余的空格(string1.前后空格,2.中间空格)
    iOS 自定义键盘ToolBar(与键盘的弹出、收起保持一致)
    iOS上线...踩坑
    iOS10 导航条,这个二狗子变了...踩坑
    ios程序发布测试打包
    获取毫秒级时间戳
    弹簧动画效果(系统自带方法)
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/6385020.html
Copyright © 2011-2022 走看看