日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第七周学习笔记

發布時間:2025/3/16 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第七周学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

#第七周筆記##

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 -s

2.聽說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。
示例:

/* wait1.c */ #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdlib.h> main() { pid_t pc,pr; pc=fork();if(pc<0) /* 如果出錯 */ printf("error ocurred!/n"); else if(pc==0){ /* 如果是子進程 */ printf("This is child process with pid of %d/n",getpid()); sleep(10); /* 睡眠10秒鐘 */ } else{ /* 如果是父進程 */ pr=wait(NULL); /* 在這里等待 */ printf("I catched a child process with pid of %d/n"),pr); } exit(0); }

編譯并運行:

$ 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無意義。
示例:

/* wait2.c */ #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> main() { int status; pid_t pc,pr;pc=fork(); if(pc<0) /* 如果出錯 */ printf("error ocurred!/n"); else if(pc==0){ /* 子進程 */ printf("This is child process with pid of %d./n",getpid()); exit(3); /* 子進程返回3 */ } else{ /* 父進程 */ pr=wait(&status); if(WIFEXITED(status)){ /* 如果WIFEXITED返回非零值 */ printf("the child process %d exit normally./n",pr); printf("the return code is %d./n",WEXITSTATUS(status)); }else /* 如果WIFEXITED返回零 */ printf("the child process %d exit abnormally./n",pr); } }

編譯并運行:

$ gcc wait2.c -o wait2 $ ./wait2

waitpid

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參數用的很少。
示例

ret=waitpid(-1,NULL,WNOHANG | 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;
示例

/* waitpid.c */ #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> main() { pid_t pc, pr;pc=fork(); if(pc<0) /* 如果fork出錯 */ printf("Error occured on forking./n"); else if(pc==0){ /* 如果是子進程 */ sleep(10); /* 睡眠10秒 */ exit(0); } /* 如果是父進程 */ do{ pr=waitpid(pc, NULL, WNOHANG); /* 使用了WNOHANG參數,waitpid不會在這里等待 */ if(pr==0){ /* 如果沒有收集到子進程 */ printf("No child exited/n"); sleep(1); } }while(pr==0); /* 沒有收集到子進程,就回去繼續嘗試 */ if(pr==pc) printf("successfully get child %d/n", pr); else printf("some error occured/n"); }

編譯并運行:
```
$ cc waitpid.c -o waitpid
$ ./waitp

轉載于:https://www.cnblogs.com/Ychancy/p/10017658.html

總結

以上是生活随笔為你收集整理的第七周学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。