用于获取和释放PID的API

时间:2015-03-26 18:15:25

标签: c operating-system fork

我从书中得到了我的第一份Hw作业。任何人都可以帮助我设计我的代码。我不知道从哪里开始。我正在考虑使用一个全零的数组作为第一步,但我真的不知道该怎么做。我不明白如何创建父进程,当我这样做时,它应该初始化一个共享内存段是我的数组应该进入哪里?这本书非常好,但真的不能解释我在程序中需要做什么,或者没有提供任何样本输出。谢谢你的帮助

  

操作系统的pid管理器负责管理流程   身份标识。首次创建进程时,会为其分配唯一的进程   pid经理的pid。 pid在返回pid管理器时返回   该过程完成执行,管理员可能稍后重新分配   这个pid。过程标识符将在Section中进行更全面的讨论   3.3.1。这里最重要的是要认识到进程标识符必须是唯一的;没有两个活动进程可以具有相同的功能   PID。使用以下常量来标识可能的pid范围   值:    #define MIN PID 300 #define MAX PID 5000您可以使用您选择的任何数据结构来表示流程的可用性   身份标识。一种策略是采用Linux所做的并使用一个   位图i中值为0的位图表示进程ID   值i可用,值1表示进程ID   目前正在使用中。

  • int allocate map(void)-Create sand初始化数据结构 代表pids;如果不成功则返回-1,如果成功则返回1

  • int allocate pid(void) - 分配并返回一个pid;返回 - 1 如果无法分配pid(所有pid都在使用中)

  • void release pid(int pid)-Releases a pid

3 个答案:

答案 0 :(得分:0)

创建一个初始化共享内存段的父项,然后创建一些子项。每个子节点扫描内存段以查找空闲插槽(意味着内存位置偏离基址),并将该插槽的索引作为其模拟的“pid”返回,将0值替换为其子ID或其他一些指示插槽被采取。这是一个开始

答案 1 :(得分:0)

也许这已经很晚了。但我也遇到了同样的问题,制定了以下内容并希望对其进行交叉检查。我找不到任何完整的解决方案,但无论如何,这就是我所做的:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

#define MIN_PID 500
#define MAX_PID 3000
#define cb CHAR_BIT

int sz = MAX_PID - MIN_PID + 1;

unsigned char *b;

int allocate_map();
int allocate_pid();
void release_pid(int pid);

int main() 
{
    int map = allocate_map();
    if (map == 1) {
        printf("\nData Structure initialized.\n");
        int id = 0, i = 0;
        while (i < 15) {
            int val = allocate_pid();
            printf("\nProcess %d: pid = %d", i+1, val);
            i++;
        }
        release_pid(503); printf("\nProcess 503 released.");
        release_pid(505); printf("\nProcess 505 released.");
        int val = allocate_pid(); printf("\nProcess %d : pid = %d\n", i+1, val);
    }
    else printf("\nFailed to initialize data structure.\n");
}

/* Creates and initializes a data structure for representing pids;
 returns —1 if unsuccessful, 1 if successful */
int allocate_map() {
    b = (unsigned char*)malloc((sz+cb-1)/cb * sizeof(char));
    if (b) return 1;
    return -1;
}

/* Allocates and returns a pid; returns -1
if unable to allocate a pid (all pids are in use) */
int allocate_pid() {
    int i = 0;
    int pid = b[i/cb] & (1 << (i & (cb-1)));
    while (pid != 0) {
        i++;
        pid = b[i/cb] & (1 << (i & (cb-1)));
        }

    if (i+MIN_PID > MAX_PID) return -1;
    b[i/cb] |= 1 << (i & (cb-1));
    return i+MIN_PID;
}

/* Releases a pid */
void release_pid(int pid) {
    if (pid < 500) {
        printf("\nInvalid PID: It should lie between 500 and 3000.");
        return;
    }
    int i = pid - MIN_PID;
    b[i/cb] &= ~(1 << (i & (cb-1)));
}

答案 2 :(得分:0)

我在阅读Operating system concepts, 10th edition书时也遇到了这个问题。我没有找到任何参考来交叉检查我的解决方案。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>

#define MIN_PID 300
#define MAX_PID 5000

int get_random();
int allocate_map(void);
int allocate_pid();
void release_pid();

bool* pid_map;

int main() {
    // initiate pid map
    if(allocate_map() == -1){
        printf("unable to create the pid map\n");
    }

    // sample pid for feature release
    int pid1, pid2;

    // allocate pids
    for(int i = 0; i < 1000; i ++){
        int pid = allocate_pid();
        if(i == 3) pid1 = pid;
        if(i == 4) pid2 = pid;
        printf("PID: %d\n", pid);
    }

    // release pids
    release_pid(pid1);
    release_pid(1000);
    release_pid(pid2);

}

int allocate_map(void){
    srand(time(0));
    pid_map = malloc(sizeof(bool) * MAX_PID); // yah, allocated extra 300 pid
    return pid_map == NULL ? -1 : 1;
}

int allocate_pid(){
    int pid = get_random();
    while(pid_map[pid] == true){
        pid = get_random();
    }
    pid_map[pid] = true;
    return pid;
}


void release_pid(int pid){
    if(pid_map[pid] == true){
        pid_map[pid] = false;
        printf("Release pid %d\n", pid);
    } else {
        printf("PID %d is not associated with any process\n", pid);
    }
}


//to get a random number between max and min pid
int get_random(){
    return (rand() % (MAX_PID - MIN_PID + 1) + MIN_PID);
}