📄 test15_d.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 + -