国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Linux--信號時序競態

2019-11-06 06:18:21
字體:
來源:轉載
供稿:網友

1. 有問題的mysleep函數,主要注釋部分的解釋

#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <signal.h>void sig_handle(int signo){	}unsigned int mysleep(unsigned int nsec){	//int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);	struct sigaction newaction, oldaction;		newaction.sa_handler = sig_handle;	sigemptyset(&newaction.sa_mask);	newaction.sa_flags = 0;		if (sigaction(SIGALRM, &newaction, &oldaction) < 0)	{		PRintf("sigaction error/n");		return -1;	}		//假如CPU太忙了,nsec之后內核還在處理別的進程的事,當處理完成后,內核執行這個進程的事,	//由于這時候已經到時間了,按照內核的處理方式,先檢查該進程有沒有未處理的信號,結果發現	//存在alarm信號沒有處理,從而調用信號處理函數。這時候信號到達不了用戶空間了。導致pause	//無限制等待	alarm(nsec);	pause();		unsigned int leaveSec = alarm(0);	sigaction(SIGALRM, &oldaction, NULL);		return leaveSec;}int main(int argc, char *argv[]){	while(1)	{		unsigned int leaveSec = mysleep(2);		printf("2 seconds after, leave %u!/n", leaveSec);	}	return 0;}

2. 改進后的mysleep函數,使用信號屏蔽和掛起的原子操作
#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <signal.h>void sig_handle(int signo){	}unsigned int mysleep(unsigned int nsec){	sigset_t newset, oldset, emptyset;	sigemptyset(&newset);	sigemptyset(&emptyset);		sigaddset(&newset, SIGALRM);		if (sigprocmask(SIG_BLOCK, &newset, &oldset) < 0)	{		printf("sigprocmask error/n");		return -1;	}		struct sigaction newact, oldact;	newact.sa_handler = sig_handle;	sigemptyset(&newact.sa_mask);	newact.sa_flags = 0;		if (sigaction(SIGALRM, &newact, &oldact) < 0)	{		printf("sigaction error/n");		return -1;	}		alarm(nsec);	sigsuspend(&emptyset);		unsigned int nleave = alarm(0);	sigaction(SIGALRM, &oldact, NULL);		sigprocmask(SIG_SETMASK, &oldset, NULL); 		return nleave;}int main(int argc, char *argv[]){	while(1)	{		unsigned int leave = mysleep(1);				printf("1s passed, time leave %u/n", leave);	}	return 0;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 错那县| 儋州市| 临沧市| 武邑县| 贺州市| 嘉鱼县| 民权县| 许昌县| 霍城县| 浏阳市| 平凉市| 上饶县| 金阳县| 乐亭县| 昌图县| 湘乡市| 鱼台县| 措勤县| 名山县| 开平市| 湖北省| 通山县| 平泉县| 金湖县| 抚顺县| 腾冲县| 安庆市| 临夏市| 邢台县| 哈尔滨市| 阜康市| 瓦房店市| 东乡县| 汉川市| 沁阳市| 汶川县| 宣化县| 永仁县| 扶余县| 耒阳市| 武宣县|