❶ linux镄剆ignal
c璇瑷signal鍑芥暟镄勫簲鐢锛
signal鏄涓涓绯荤粺璋幂敤銆傛槸涓绉岖壒娈婄殑涓鏂锛屽綋镆愮岖壒瀹氱殑钬滆蒋浠朵腑鏂钬濆彂鐢熸椂銆傜敤浜庤皟鐢ㄧ殑绋嫔簭銆备腑鏂阃氩父鏄绋嫔簭杩愯屼腑鍑虹幇镄勭壒娈婃儏鍐碉纴濡傚紩鐢ㄧ壒娈婂唴瀛树腑镄勯潪娉曞湴鍧锛屾诞镣规暟琚0闄ゃ
signal()镄勫师鍨嬩负锛
#includesignal锛岿>
void(*signal(inthum锛寁oid(*func)(int)))(int)銆
signal涓镄刬nt_鏁板强鍏跺惈涔
SIGHUP1A缁堢鎸傝捣鎴栬呮带鍒惰繘绋嬬粓姝
SIGINT2A阌鐩树腑鏂锛埚侠reak阌琚鎸変笅锛
SIGQU99v3C阌鐩樼殑阃鍑洪敭琚鎸変笅
SIGILL4C闱炴硶鎸囦护
SIGABRT6C鐢盿bort(3)鍙戝嚭镄勯鍑烘寚浠
SIGFPE8C娴镣瑰纾甯
SIGKILL9AEFKill淇″彿
SIGSEGV11C镞犳晥镄勫唴瀛桦紩鐢
SIGPIPE13A绠¢亾镰磋:鍐欎竴涓娌℃湁璇籶ort镄勭¢亾
SIGALRM14A鐢盿larm(2)鍙戝嚭镄勪俊鍙
SIGTERM15A缁堟淇″彿
SIGUSR130,10,16A鐢ㄦ埛镊宸卞畾涔変俊鍙1
SIGUSR231,12,17A鐢ㄦ埛镊宸卞畾涔変俊鍙2
SIGCHLD20,17,18B瀛愯繘绋嬬粨𨱒熶俊鍙
SIGCONT19,18,25杩涚▼缁х画锛堟浘琚锅沧㈢殑杩涚▼锛
SIGSTOP17,19,23DEF缁堟㈣繘绋
SIGTSTP18,20,24D鎺у埗缁堢锛坱ty锛変笂鎸変笅锅沧㈤敭
SIGTTIN21,21,26D钖庡彴杩涚▼浼佸浘浠庢带鍒剁粓绔璇
SIGTTOU22,22,27D钖庡彴杩涚▼浼佸浘浠庢带鍒剁粓绔鍐
浠ヤ笅镄勪俊鍙锋病鍦≒OSIX.1涓鍒楀嚭锛岃屽湪SUSv2鍒楀嚭
SIGBUS10,7,10C镐荤嚎阌栾(阌栾镄勫唴瀛榑闂)
SIGPOLLASysV瀹氢箟镄凯ollable浜嬩欢锛屼笌SIGIO钖屼箟
SIGPROF27,27,29AProfiling瀹氭椂鍣ㄥ埌
SIGSYS12,-,12C镞犳晥镄勭郴缁熻皟鐢(SVID)
SIGTRAP5C璺熻釜/鏂镣规崟銮
SIGURG16,23,21BSocket鍑虹幇绱фユ浔浠(4.2BSD)
SIGVTALRM26,26,28A瀹为檯镞堕棿鎶ヨ︽椂阍熶俊鍙(4.2BSD)
SIGXCPU24,24,30C瓒呭嚭璁惧畾镄凛PU镞堕棿闄愬埗(4.2BSD)
SIGXFSZ25,25,31C瓒呭嚭璁惧畾镄勬枃浠堕檺鍒跺ぇ灏(4.2BSD)
锛埚逛簬SIGSYS銆係IGXCPU銆係IGXFSZ銆备互鍙婃煇浜涙満鍣ㄤ綋绯荤粨鏋勪笅镄凷IGBUS锛孡inux缂虹渷镄勫姩浣沧槸A(terminate)锛孲USv2鏄疌(terminateandmpcore)锛夈
浠ヤ笅鏄鍏朵粬镄勪竴浜涗俊鍙
淇″彿鍊煎勭悊锷ㄤ綔鍙戝嚭淇″彿镄勫师锲
SIGIOT6CIO鎹曡幏鎸囦护锛屼笌SIGABRT钖屼箟
SIGEMT7,-,7
SIGSTKFLT-,16,-A鍗忓勭悊鍣ㄥ爢镙堥敊璇
SIGIO23,29,22A镆怚/O镎崭綔濡备粖鑳藉熻繘琛屼简(4.2BSD)
SIGCLD-,-,18A涓岙IGCHLD钖屼箟
SIGPWR29,30,19A鐢垫簮鏁呴㱩(SystemV)
SIGINFO29,-,-A涓岙IGPWR钖屼箟
SIGLOST-,-,-A鏂囦欢阌佷涪澶
SIGWINCH28,28,20B绐椾綋澶у皬鏀瑰彉(4.3BSD,Sun)
SIGUNUSED-,31,-A链浣跨敤镄勪俊鍙(willbeSIGSYS)
Linux涓嫔备綍銮峰彇缃戝崱淇℃伅锛
镆ョ湅linux镄勭绣鍗′俊鎭姝ラゅ备笅锛氩伐鍏峰师鏂欙细linux镎崭綔绯荤粺鈶犲惎锷╨inux镎崭綔绯荤粺锛岃繘鍏ュ埌妗岄溃锛
鈶″惎锷ㄧ粓绔锛
鈶㈢粓绔杈揿叆锻戒护ifconfigeth0锛屽洖杞︼绂鈶linux镄勭绣鍗′俊鎭瑙h伙细
1.镆ョ湅缃戝崱鐢熶骇铡傚晢鍜屼俊鍙凤细镆ョ湅锘烘湰淇℃伅锛歭spci镆ョ湅璇︾粏淇℃伅锛歭spci-vvv#3涓灏忓啓镄剉镆ョ湅缃戝崱淇℃伅锛歭spci|grepEthernet锛
2.镆ョ湅缃戝崱椹卞姩锛氭煡鐪嬬绣鍗¢┍锷ㄤ俊鎭锛歭spci-vvv#镓惧埌缃戝崱璁惧囩殑璇︾粏淇℃伅锛屽寘𨰾缃戝崱椹卞姩#lsmod鍒楀嚭锷犺浇镄勬墍链夐┍锷锛屽寘𨰾缃戝崱椹卞姩锛
3.镆ョ湅缃戝崱椹卞姩鐗堟湰镆ョ湅妯″潡淇℃伅锛歮odifomolename>#鍏朵腑鍖呭惈version淇℃伅鎴#ethtool-idevicename>锛
4.镆ョ湅缃戠粶鎺ュ彛阒熷垪鏁版煡鐪嬬绣鍗℃帴鍙g殑涓鏂淇℃伅锛#cat/proc/interrupts|grepeth0鎴#ethtool-Seth0锛
5.镆ョ湅缃戝崱椹卞姩婧愮爜镄勭増链鍙疯В铡娅ntel缃戝崱椹卞姩婧愮爜锛屾墦寮瑙e帇缂╃洰褰曚笅镄*.spec鏂囦欢镆ョ湅椹卞姩镄勭増链锛
淇″彿he鏄鎸囦粈涔堬纻
淇″彿he鏄鎸囩殑鏄淇″彿镄勭瘒骞呰缉灏戯纴灏辨妸浠栧拰淇″彿閲忔斁鍦ㄤ竴璧蜂简淇″彿锛氾纸signal锛夋槸涓绉嶅勭悊寮傛ヤ簨浠剁殑鏂瑰纺銆备俊鍙锋椂姣旇缉澶嶆潅镄勯氢俊鏂瑰纺锛岀敤浜庨氱煡鎺ュ弹杩涚▼链夋煇绉崭簨浠跺彂鐢燂纴闄や简鐢ㄤ簬杩涚▼澶栵纴杩桦彲浠ュ彂阃佷俊鍙风粰杩涚▼链韬銆
linux闄や简鏀鎸乽nix镞╂湡镄勪俊鍙疯涔夊嚱鏁帮纴杩樻敮鎸佽涔夌﹀悎posix.1镙囧嗳镄勪俊鍙峰嚱鏁
涓轰粈涔坙inux閲岀殑淇″彿鍙戦佸嚱鏁板彨kill锻锛
鐖惰繘绋嬩细姣斿瓙杩涚▼鎻愭棭缁撴潫锛屽湪浣犲瓙杩涚▼鍙杙pid杩欎釜镞堕棿鐖惰繘绋嫔凡缁忕粨𨱒熶简锛岃繖涓镞跺欑浉褰扑簬瀛愯繘绋嫔彉鎴恴ombie锛屼细琚玦nit鏀跺吇锛堣繖涓鍦版柟鎴戜篃涓嶅お镍傦纴姝e父𨱒ヨ村簲璇ュ瓙杩涚▼镄刾pid鏄1锛岃存槑浣犵殑瀛愯繘绋嬭玦nit涔嫔栫殑杩涚▼鏀跺吇浜嗭级阒诲炵埗杩涚▼鎴栬厀hile1镄勪綔鐢ㄦ槸涓嶈╃埗杩涚▼缁撴潫锛屼互渚垮瓙杩涚▼鍙栧肩殑镞跺欑埗杩涚▼渚濈劧淇濈暀
linux淇″彿閲忕嚎绋嬭繘绋嫔尯鍒锛
淇″彿閲忓湪杩涚▼鏄浠ユ湁钖崭俊鍙烽噺杩涜岄氢俊镄勶纴鍦ㄧ嚎绋嬫槸浠ユ棤钖崭俊鍙疯繘琛岄氢俊镄勶纴锲犱负绾跨▼linux杩樻病链夊疄鐜拌繘绋嬮棿镄勯氢俊锛屾墍浠ュ湪sem_init镄勭浜屼釜鍙傛暟瑕佷负0锛岃屼笖鍦ㄥ氱嚎绋嬮棿镄勫悓姝ユ槸鍙浠ラ氲繃链夊悕淇″彿閲忎篃鍙阃氲繃镞犲悕淇″彿锛屼絾鏄涓鑸𨱍呭喌绾跨▼镄勫悓姝ユ槸镞犲悕淇″彿閲忥纴镞犲悕淇″彿閲忎娇鐢ㄧ亩鍗曪纴钥屼笖sem_t瀛桦偍鍦ㄨ繘绋嬬┖闂翠腑锛屾湁钖崭俊鍙烽噺蹇呴’LINUX鍐呮牳绠$悊锛岀敱鍐呮牳缁撴瀯structipc_ids瀛桦偍锛屾槸闅忓唴镙告寔缁镄勶纴绯荤粺鍏抽棴锛屼俊鍙烽噺鍒椤垹闄わ纴褰撶劧涔熷彲浠ユ樉绀哄垹闄わ纴阃氲繃绯荤粺璋幂敤鍒犻櫎锛
娑堟伅阒熷垪锛屼俊鍙烽噺锛屽唴瀛桦叡浜锛岃繖鍑犱釜閮芥槸涓镙风殑铡熺悊銆傦纴鍙涓嶈繃淇″彿閲忓垎涓烘湁钖崭笌镞犲悕
❷ linux 中 kill() 与 signal() 函数
虽然子进程将父进程的函数重新拷贝了一份,子进程和父进程共享同一段内存空间,但不能被共享。可以通过共享内存解决这个问题。使用这个函数void* mmap(void * addr, size_t len, int prot, int flags, int fd, off_t offset)把进程地址空间映射为共享内存。addr为被映射的进程地址空间内存地址,取NULL表示由系统决定;len为被映射地址空间的长度;prot为内存映射区保护参数,通常取为PROT_READ|PROT_WRITE;flags为标志,通常取为MAP_SHARED|MAP_ANON;fd取为-1,offset取为0。成功返回被映射区的起始地址,失败返回错误码。需要的头文件为:sys/mman.h。
使用方法:int * share; //假设要把share所指向的一个整型变量映射为共享内存空间。
share = (int *)mmap(NULL, sizeof(int), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0 )这样就能实现你说的 了.
❸ Linux进程间通信第三讲 信号signal kill
信号是Linux系统中一种重要的机制,其本质是一种软件中断,与硬件中断类似,用于在程序执行过程中提供异常处理。当一个进程接收到信号时,它会暂停当前任务,转而执行相应的信号处理函数,处理完成后继续执行原任务。Linux系统中支持64个信号,这些信号通过宏定义表示,如SIGKILL表示9号信号。信号可以分为两类:可靠信号(支持排队)和不可靠信号(不支持排队),前者如1-31号信号,后者如34-64号信号。当一个进程同时收到多个相同信号时,可靠信号都能接收,而不可靠信号可能会丢失。
信号的处理方式主要有三种:默认处理、忽略信号、捕获信号。默认处理通常导致进程退出,忽略信号则不进行任何操作,而捕获信号允许开发人员自定义处理函数。Linux提供了`signal`函数来设置信号的处理方式,参数包括要设置的信号、处理方式,以及默认处理、忽略信号、自定义函数三种选项。
当设置为捕获信号方式时,需要编写一个自定义的信号处理函数。收到信号后,程序会暂停当前任务并调用该函数。信号处理函数的定义为无返回值,接受一个int类型的参数。例如,当使用`signal`函数将信号处理方式设置为捕获信号,并在收到SIGINT信号时调用自定义函数时,可以实现用户友好的中断处理,如显示提示信息或执行特定操作。
值得注意的是,信号处理方式的继承机制:通过`fork`、`vfork`创建的子进程完全继承父进程的信号处理方式,而使用`fork`、`vfork`后再调用`exec`系列函数创建的子进程,只有捕获信号的方式不继承,因为`exec`函数会替换进程内容,导致信号处理函数不存在。
信号的发送可以通过多种方式实现。除了通过键盘快捷键(如`ctrl + c`发送SIGINT信号)或硬件故障、程序错误等触发外,还可以使用系统命令(如`kill`命令)或编程接口(如`kill`、`raise`、`alarm`、`pause`函数)来发送信号。例如,通过`kill`函数可以向进程发送特定信号,`raise`函数允许进程自身发送信号,而`alarm`函数则让进程等待一段时间后发送特定信号给自己。
信号的屏蔽机制允许在关键代码执行期间暂时忽略信号,以避免中断导致错误发生。这通过信号集实现,信号集是一个表示信号集合的整数类型,可以记录需要屏蔽的信号。Linux系统提供了相应的函数接口来管理信号集,包括设置、测试、清除信号屏蔽等操作。
在实际应用中,合理利用信号机制可以提高程序的健壮性和用户交互体验。例如,通过屏蔽特定信号在关键代码执行期间,可以防止信号中断导致的错误,待关键代码执行完毕后再恢复信号处理,确保程序的稳定性和正确性。通过结合信号发送和屏蔽机制,可以实现更灵活、更安全的异常处理流程。