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

  • 相关阅读:
    linux-kernel-module
    Linux-find
    ffmpeg02
    Redhat 7使用CentOS 7的Yum网络源
    Redhat7配置yum源(本地源和网络源)
    8、源码安装
    6.存储结构与磁盘划分
    5.用户身份与文件权限
    4.Vim编辑器与Shell命令脚本
    3.管道符、重定向与环境变量
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/6385020.html
Copyright © 2011-2022 走看看