⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test15_d.c

📁 进程间调度
💻 C
字号:
#include "test15.h"void resource_free();void sig_pause();void sig_kill();int b_pause;int shm_id;struct PInfo *shm_addr;int main(int argc, char *argv[]){ int pid; long i, N; shm_id = shmget(SHM_KEY, sizeof(struct PInfo)*5, IPC_CREAT|0600); if(shm_id == -1)      /*创建共享内存,并获取共享内存的id*/   {    printf("shmget faild !!!\n");    exit(0);   } shm_addr = (struct PInfo *)shmat(shm_id, 0, 0); if(!shm_addr)         /*使并行计算进程与共享内存相连,并获取共享内存首地址*/   {    printf("shmat faild !!!\n");    exit(0);   } b_pause = 0; i = atol(argv[1]); N = shm_addr[0].num; pid = (int)i; shm_addr[pid].pid = getpid();   /*对共享内存中并行计算进程的状态位进行初始化*/ shm_addr[pid].pstatus = 'R'; shm_addr[pid].num = 0; shm_addr[pid].result = 0; signal(16, sig_pause);          /*定义软中断处理函数*/ signal(17, sig_kill); while(i <= N)                     {       if(b_pause)          pause();       shm_addr[pid].num = i;       shm_addr[pid].result += i*i;       i += 4;       sleep(1);      } shm_addr[pid].pstatus = 'F'; kill(shm_addr[0].pid, 16);      /*向求和进程发送计算完毕的信号*/ resource_free();}/*void resource_free()返回值:无参数: 无函数功能:使并行计算进程与共享内存脱离,若没有其他进程使用共享内存,则将共享内存销毁。*/void resource_free(){ int sta; struct shmid_ds shm_buf; if(shmdt(shm_addr) == -1)              /*并行计算进程与共享内存脱离*/    printf("shmdt faild in resource_free() !!!\n"); sta = shmctl(shm_id, IPC_STAT, &shm_buf); if(sta == -1)    printf("shmctl faild in resource_free() !!!\n"); else   {    if(shm_buf.shm_nattch == 0)        /*若已没有进程与共享内存相连,则将共享内存销毁*/      {       sta = shmctl(shm_id, IPC_RMID, 0);       if(sta == -1)          printf("shmctl faild in resource_free() !!!\n");      }   }}/*void sig_pause()返回值:无参数: 无函数功能:收到监控程序发送的令并行计算进程暂停运行的信号时,执行的软中断处理函数。*/void sig_pause(){ int k; for(k=1; k<=4; k++)     if(shm_addr[k].pid == getpid())        break; if(!b_pause)   {     b_pause = 1;     shm_addr[k].pstatus = 'P';   } else   {    b_pause = 0;    shm_addr[k].pstatus = 'R';   }}/*void sig_kill()返回值:无参数: 无函数功能:收到监控程序发送的令并行计算进程退出运行的信号时,执行的软中断处理函数。*/void sig_kill(){ int k; for(k=1; k<=4; k++)     if(shm_addr[k].pid == getpid())        break; shm_addr[k].pstatus = 'X'; kill(shm_addr[0].pid, 16);        /*当并行计算进程被终止运行时,向求和进程发送信号*/ resource_free(); exit(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -