第七周学习笔记
#第七周筆記##
1.內核gdb調試報錯
(gdb) target remote:1234 :1234: \u8fde\u63a5\u8d85\u65f6.原因是沒有凍結窗口,落了一步,絕了
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s2.聽說macro參數status并不同于wait的參數-int型指針status,咋不同啦?
活動筆記
wait
pid_t wait(int *status)進程調用了wait,立即阻塞父進程,wait分析當前進程的某個子進程是否已經退出。
case1:成功,找到僵尸子進程,wait就會收集子進程信息,徹底銷毀,返回;
case2:失敗,沒有找到僵尸子進程,wait一直阻塞在這里,直到有一個出現。
參數status用來保存被收集進程退出時的一些狀態,它是一個指向int類型的指針,可以設定這個參數為NULL。
case1:wait成功,返回被收集的子進程的進程ID;
case2:調用失敗,調用進程沒有子進程,wait返回-1,同時errno被置為ECHILD。
示例:
編譯并運行:
$ gcc wait1.c -o wait1 $ ./wait1宏macro:
1.WIFEXITED(status):子進程是否為正常退出的。
若是,返回一個非零值(請注意,雖然名字一樣,這里的參數status并不同于wait唯一的參數---指向整數的指針status,而是那個指針所指向的整數,切記不要搞混了)
2、WEXITSTATUS(status) :子進程返回值。
case1:返回非零值,提取子進程的返回值;
case2:如果子進程調用exit(5)退出,返回5;
case3:如果子進程調用exit(7),返回7;
case4:不是正常退出的,返回0無意義。
示例:
編譯并運行:
$ gcc wait2.c -o wait2 $ ./wait2waitpid
waitpid多出了兩個可由用戶控制的參數pid和options.
pid:
pid>0,只等待進程ID等于pid的子進程;
pid=0,等待同一個進程組中的任何子進程(如果子進程已經加入了別的進程組,waitpid不care);
pid=-1,等待任何一個子進程退出;
pid<-1,等待指定進程組中的任何子進程,進程組的ID等于pid的絕對值。
options:
Linux中只支持WNOHANG和WUNTRACED兩個選項,這是兩個常數,可以用"|"運算符把它們連接起來使用。
WNOHANG參數調用waitpid,即使沒有子進程退出,它也會立即返回,不會像wait那樣永遠等下去。
WUNTRACED參數用的很少。
示例
可以把options設為0.
ret=waitpid(-1,NULL,0); static inline pid_t wait(int * wait_stat) { return waitpid(-1,wait_stat,0); }返回值和錯誤:
case1:waitpid返回收集到的子進程的進程ID;
case2:設置了選項WNOHANG,而調用中waitpid發現沒有已退出的子進程可收集,則返回0;
case3:調用中出錯,則返回-1,這時errno會被設置成相應的值以指示錯誤所在;
case4:pid所指示的子進程不存在,或此進程存在,但不是調用進程的子進程,waitpid就會出錯返回,這時errno被設置為ECHILD;
示例
編譯并運行:
```
$ cc waitpid.c -o waitpid
$ ./waitp
轉載于:https://www.cnblogs.com/Ychancy/p/10017658.html
總結
- 上一篇: mongodb基本指令与高级查询指令以及
- 下一篇: cqoi2018