• 进程控制(一)


    1.进程标识符

    进程标识符类型是pid_t,本质上是一个无符号整数。

    每个进程有6个重要的ID:

    进程ID、父进程ID、有效用户ID、有效组ID、实际用户ID、实际组ID

    分别用getpid()、getppid()、geteuid()、getegid()、getuid()、getgid()这几个函数得到。

    2.进程操作

    (1)fork()函数创建一个新的进程,fork()函数一次调用两次返回

    fork()函数返回值三种情况:

    对于父进程,fork()返回的是子进程的ID,只有内核的进程为0,所以子进程的ID只能大于0,因此可以通过返回值来区别子进程和父进程。如果返回值为0,说明是在子进程中运行,如果返回值大于0,说明是在父进程中运行。如果返回值为-1,说明fork()函数出错。下面举例说明:

    pid=fork();
    
    if(pid < 0)
    
    {
    
           perror(“fail to fork”);
    
            exit(1);
    
    }
    
    else If(pid == 0)
    
    {   
    
        ...
    
    }
    
    else
    
    {
    
         ...
    
    }    

    上边三段程序就是用fork()函数创建一个新进程之后通常要进行的判断,这一段代码是对于fork()函数一次调用两次返回最好的理解。fork()函数的返回值总共用三种情况(下边用pid代表fork()函数的返回值)

    1.当pid < 0,返回值小于0代表创建进程失败,此时需要进程的操作返回错误信息;

    2.当pid = 0,返回值等于0代表此时的进程是子进程,此时进程的操作是在子进程中进行的,这是fork()函数的精髓,在子进程与在父进程中一样可以进行函数调用等等。

    3.当pid > 0,返回值大于0代表此时的进程是父进程。

    最早开始看fork()函数的时候看不明白,总觉得很奇怪,后来还是通过敲代码,整体的去理解程序,看调试结果才慢慢理解fork()函数,从一开始学进程管理到现在,敲过通过fork()函数创建新进程的程序至少有20个了,这20多次的不断写,不断理解才让我对于进程和fork()函数了解的更透彻,后边的学习中还会接触到兄弟进程,如果fork()函数的了解不清楚的话,兄弟进程就会弄混淆,导致在之后学习兄弟进程间通过管道进行通信的时候出错,基础知识的学习是环环相扣的,这些基本的东西了解清楚之后,对于以后的学习才不会拖后腿,学习这些基础的东西,关键还是敲代码,使劲敲代码,一个程序敲一遍不懂,敲20遍肯定就明白了,而且记牢了,如果边敲边思考,20遍之后应该已经回简单的应用了。

    (2)fork()函数和vfork函数的区别

    fork()函数创建新进程,之后为这个新进程分配进程空间,将父进程空间中的内容复制到子进程空间中,包括数据段和堆栈段,和父进程空间共享代码段。子进程对于数据段和堆栈段的修改不影响父进程。

    vfork()函数闯进新进程,子进程与父进程完全共享地址空间,包括代码段、数据段和堆栈段,子进程对这些共享资源所做的修改可以影响父进程。

    (3)exit()函数检查进程出错信息

    exit()函数的参数是该程序的退出状态,如果正常退出,参数为0;如果异常退出,参数非0。

    (4)设置进程所有者

    每一个进程都有两个用户ID,实际用户ID和有效用ID,这两个值一般相等,其值为进程所有者的用户ID。有些情况下需要修改进程的有效用户ID。

    #include <unistd.h>
    
    int setuid(uid_t uid);

    setuid()函数的参数表示改变后的新用户的实际用户ID和有效用户ID,成功返回0,失败返回-1。

    #include <unistd.h>
    
    int seteuid(uid_t uid);

    seteuid()函数的参数表示改变后的新用户的有效用户ID(只改变有效用户ID),成功返回0,失败返回-1。

  • 相关阅读:
    C# 中的EventHandler
    Leetcode:Combinations 组合
    Leetcode:Minimum Path Sum
    [LeetCode] Container With Most Water
    一个数n的最少可以由多少个数的平方和组成
    单链表的归并排序
    几个常用的操作系统进程调度算法(转)
    字符串的最长重复子串(转)
    linux静态链接库与动态链接库详解
    简易的hashtable实现
  • 原文地址:https://www.cnblogs.com/Mr--Yang/p/6241216.html
Copyright © 2020-2023  润新知