写作绅士,读作丧尸 X岛揭示板
顺猴者昌 逆猴者亡 首页版规 |用户系统 |移动客户端下载 | 丧尸路标 | | 常用图串及路标 | 请关注 官方公众号:【X岛揭示板】 官方微博: 【@X岛极速版】| 人,是会思考的芦苇
常用串:·豆知识·跑团板聊天室·公告汇总串·X岛路标

No.59843362 - 无标题 - 技术宅


回应模式
No.59843362
名 称
E-mail
标题
颜文字
正文
附加图片
•程序语言、压制投稿、视频制作以及各计算机领域的技术问题
•我觉得还是CSDN靠谱一点
•本版发文间隔为15秒。

收起 查看大图 向左旋转 向右旋转
无标题 无名氏 2023-10-14(六)23:08:37 ID:HBBYHuN [举报] [订阅] [只看PO] No.59843362 [回应] 管理
肥哥,救我(;´Д`)
有一个进程控制相关的模拟实验,是将进程按优先数排序。完全搞不定啊,共享内存,不知道为什么会有段错误。
祭品奉上
Tips 无名氏 2099-01-01 00:00:01 ID:Tips超级公民 [举报] No.9999999 管理
♡性♡感♡红♡名♡在♡线♡要♡饭♡
(〃∀〃) https://afdian.com/a/nmbxd
无标题 无名氏 2023-10-14(六)23:09:09 ID:HBBYHuN (PO主) [举报] No.59843367 管理
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
typedef struct PCB{
int Pid;
int Priority;
int Requptime;
struct PCB *next;
}PCBlink;
PCBlink* PCBfirst;
pid_t Fork(void);
void Input(int num,int*,int*);
void ProcessPrint(int,pid_t*,int*,int*);
void StatusPrint(pid_t,int,int);
void Insert(PCBlink* PCB);
void Dele_pid(pid_t pid);
PCBlink* Find_pid(pid_t pid);

int main()
{
/*输入进程的个数*/
int num,i;
printf("Please enter the number of process to create:\n");
scanf("%d",&num);
/*输入进程的优先数和要求执行时间*/
int priority[num];
int requptime[num];
printf("Please enter the priority and required run time for each process:\n");
Input(num,priority,requptime);
/*生成一个共享内存空间*/
int shmid;
if((shmid = shmget(0,sizeof(struct PCB),0640|IPC_CREAT))==-1)//shmget()的第一个参数也可以是(key_t)0x5005的形式,但是这里不需要键值对来找到这个空间
{printf("shmat failed\n"); return -1;}
PCBlink* PCBfirst=(PCBlink*)shmat(shmid,0,0);
PCBfirst->next = NULL;
/*插入进程控制链表*/

/*生成子进程*/
pid_t pid[num];
for(i=0;i<num;i++)
{
if((pid[i] = Fork())==0)//用pid[]i记录每一个子进程的进程号
{
pid_t mypid = getpid();//初始化每个进程的pid,优先数和运行时间
int myPriority = priority[i];
int myRequptime = requptime[i];
printf("Process:%d has been crated,\tpriority:%d,\trequptime:%d\n",mypid,myPriority,myRequptime);
/*创建一个新的共享内存*/
if((shmid = shmget(0,sizeof(struct PCB),0640|IPC_CREAT))==-1)
{printf("shmat failed\n"); return -1;}
PCBlink* temp = (PCBlink*)shmat(shmid,0,0);
temp->next = NULL;
temp->Pid = (int)mypid;
temp->Priority = myPriority;
temp->Requptime = myRequptime;
/*将这个PCB插入控制队列*/
Insert(temp);//插入进程控制队列后,就失去指针*/

while(myRequptime>=0)//执行时间为0时停止进程,否则一直执行
{
if(PCBfirst->next->Pid == (int)mypid)//当进程控制队列中,是自己在队首时,才执行
{
/*找到当前进程在进程控制队列中的位置*/
PCBlink* myPCB = Find_pid(mypid);
StatusPrint(mypid,myPriority,myRequptime);
/*更改优先数和运行时间*/
myPriority--;myPCB->next->Priority = myPriority;
myRequptime--;myPCB->next->Requptime= myRequptime;
/*重新排队*/
Dele_pid(mypid);
Insert(myPCB->next);
/*输出当前进程状态*/
StatusPrint(mypid,myPriority,myRequptime);
}
/*如果进程控制队列中自己不在队首,就停止*/
else
pause();
}
/*删除这块共享内存*/
if(shmctl(shmid,IPC_RMID,0) == -1)
{printf("shmctl failed\n"); return -1;}

exit(i);
}
}
if(shmctl(shmid,IPC_RMID,0) == -1)
{printf("shmctl failed\n"); return -1;}

return 0;
}
pid_t Fork(void)//子进程生成
{
pid_t pid;
if((pid=Fork())<0)
fprintf(stderr,"Fork error");
return pid;
}
void Input(int num,int* priority,int* requptime)/*输入进程的优先数和要求执行时间*/
{
int i;
for(i=0;i<num;i++)
{
scanf("%d %d",priority+i,requptime+i);
}
}
void ProcessPrint(int num,pid_t* pid,int* priority,int* requptime)//输出初始进程
{
int i;
for(i=0;i<num;i++)
{
printf("pid:%d\tpriority:%d\treqtime:%d\n",pid+i,priority+i,requptime+i);
}
}
void StatusPrint(pid_t mypid,int myPriority,int myRequptime)//输出当前进程状态
{
printf("pid:%d\t\tpriority:%d\t\trequptime:%d\n",mypid,myPriority,myRequptime);
}
void Insert(PCBlink* PCB)//参数为一个PCB指针,插入到进程控制队列
{
PCBlink* temp=PCB;
PCBlink* head=PCBfirst;
while(head->next && temp->Priority<(head->next->Priority))
{
head=head->next;
}
temp->next = head->next;
head->next = temp;
PCB = temp;
}
PCBlink* Find_pid(pid_t pid)//按照Pid寻找进程,返回pid对应的前一个链表的指针
{
PCBlink* head=PCBfirst;
if(head->next)
{
while(head->next->Pid != pid)
{
head = head->next;
}
return head;
}
printf("Failed to find process:%d",pid);
return NULL;
}
void Dele_pid(pid_t pid)//从PCB链表中删除对应pid的PCB
{
PCBlink* temp = Find_pid(pid);
temp->next = temp->next->next;
}

UP主: