亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 6606 | 回復(fù): 12
打印 上一主題 下一主題

關(guān)于D進程和Z進程 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2011-12-05 16:15 |只看該作者 |倒序瀏覽

  1. int
  2. main(void)
  3. {
  4.         int i = 0;

  5. //      if (!fork()) {
  6.         if (!vfork()) {
  7.                 sleep(10);
  8.         }

  9.         return 0;
  10. }
復(fù)制代碼
執(zhí)行此程序后不斷產(chǎn)生Z進程:

daniel@Daniel:/usr/local/src/testsuits/0007_tiny$ ps aux | grep a.out
daniel    6548  0.0  0.0   1696   268 pts/4    D+   15:15   0:00 ./a.out
daniel    6549  0.0  0.0      0     0 pts/4    Z+   15:15   0:00 [a.out] <defunct>
daniel    6575  0.0  0.0      0     0 pts/4    Z+   15:15   0:00 [a.out] <defunct>
daniel    6601  0.0  0.0      0     0 pts/4    Z+   15:15   0:00 [a.out] <defunct>
daniel    6628  0.0  0.0      0     0 pts/4    Z+   15:16   0:00 [a.out] <defunct>
daniel    6654  0.0  0.0      0     0 pts/4    Z+   15:16   0:00 [a.out] <defunct>
daniel    6680  0.0  0.0      0     0 pts/4    Z+   15:16   0:00 [a.out] <defunct>
daniel    6697  0.0  0.0      0     0 pts/4    Z+   15:16   0:00 [a.out] <defunct>
daniel    6750  0.0  0.0      0     0 pts/4    Z+   15:16   0:00 [a.out] <defunct>
daniel    6753  0.0  0.0   1696   268 pts/4    S+   15:16   0:00 ./a.out
daniel    6755  0.0  0.0   4148   864 pts/8    S+   15:16   0:00 grep --color=auto a.out

請教:這里為什么vfork后sleep就D了,并且不斷產(chǎn)生Z進程?

論壇徽章:
0
2 [報告]
發(fā)表于 2011-12-05 16:19 |只看該作者
daniel@Daniel:/usr/local/src/testsuits/0007_tiny$ ps aux --forest | grep a.out
daniel    7457  0.0  0.0   1696   264 pts/8    D    16:19   0:00      \_ ./a.out
daniel    7458  0.0  0.0      0     0 pts/8    Z    16:19   0:00      |   \_ [a.out] <defunct>
daniel    7462  0.0  0.0      0     0 pts/8    Z    16:19   0:00      |   \_ [a.out] <defunct>
daniel    7466  0.0  0.0   1696   264 pts/8    S    16:19   0:00      |   \_ ./a.out
daniel    7468  0.0  0.0   4148   864 pts/8    S+   16:19   0:00      \_ grep --color=auto a.out

論壇徽章:
0
3 [報告]
發(fā)表于 2011-12-05 16:41 |只看該作者
本帖最后由 J_O_H_N 于 2011-12-05 16:43 編輯

執(zhí)行vfork系統(tǒng)調(diào)用后,父進程將進入TASK_UNINTERRUPTIBLE狀態(tài),直到子進程調(diào)用exit或exec

自問自答了,看的這個
http://blog.csdn.net/lizhiguo0532/article/details/6315819

但還是不懂為什么總是不斷產(chǎn)生Z進程

論壇徽章:
0
4 [報告]
發(fā)表于 2011-12-05 17:22 |只看該作者
(From  POSIX.1)  The  vfork()  function  has  the  same effect as fork(2), except that the behavior is undefined if the process created by vfork() either modifies any data other than a variable of type pid_t used to store the return  value from vfork(), or returns from the function in which vfork() was called, or calls any other function before successfully calling _exit(2) or one of the exec(3) family of functions.

論壇徽章:
11
未羊
日期:2013-12-16 12:45:4615-16賽季CBA聯(lián)賽之青島
日期:2016-04-11 19:17:4715-16賽季CBA聯(lián)賽之廣夏
日期:2016-04-06 16:34:012015亞冠之卡爾希納薩夫
日期:2015-11-10 10:04:522015亞冠之大阪鋼巴
日期:2015-07-30 18:29:402015亞冠之城南
日期:2015-06-15 17:56:392015亞冠之卡爾希納薩夫
日期:2015-05-15 15:19:272015亞冠之山東魯能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16賽季CBA聯(lián)賽之八一
日期:2016-07-22 09:41:40
5 [報告]
發(fā)表于 2011-12-05 17:26 |只看該作者
本帖最后由 zylthinking 于 2011-12-05 17:27 編輯

居然能維持棧平衡, 真他媽神奇。。。。什么樣的代碼能導(dǎo)致這個棧還能保持平衡呢???

論壇徽章:
0
6 [報告]
發(fā)表于 2011-12-05 17:41 |只看該作者
strace了一下,嘿嘿...

daniel@Daniel:/usr/local/src/testsuits/0007_tiny$ strace ./a.out
execve("./a.out", ["./a.out"], [/* 44 vars */]) = 0
brk(0)                                  = 0x89b2000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb779f000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=74325, ...}) = 0
mmap2(NULL, 74325, PROT_READ, MAP_PRIVATE, 4, 0) = 0xb778c000
close(4)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/i386-linux-gnu/libc.so.6", O_RDONLY) = 4
read(4, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\220o\1\0004\0\0\0"..., 512) = 512
fstat64(4, {st_mode=S_IFREG|0755, st_size=1434180, ...}) = 0
mmap2(NULL, 1444360, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 4, 0) = 0x704000
mprotect(0x85e000, 4096, PROT_NONE)     = 0
mmap2(0x85f000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 4, 0x15a) = 0x85f000
mmap2(0x862000, 10760, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x862000
close(4)                                = 0                                                                                                                             
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb778b000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb778b8d0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1})\
= 0
mprotect(0x85f000, 8192, PROT_READ)     = 0
mprotect(0x8049000, 4096, PROT_READ)    = 0
mprotect(0x25d000, 4096, PROT_READ)     = 0
munmap(0xb778c000, 74325)               = 0
vfork(line 0
)                                 = 9139
vfork(line 1
)                                 = 9145
--- SIGCHLD (Child exited) @ 0 (0) ---
vfork(line 2
)                                 = 9151
vfork()                                 = ? ERESTARTNOINTR (To be restarted)
--- SIGCHLD (Child exited) @ 0 (0) ---
vfork(line 3
)                                 = 9158
--- SIGCHLD (Child exited) @ 0 (0) ---
vfork(line 4

)                                 = 9164
vfork()                                 = ? ERESTARTNOINTR (To be restarted)
--- SIGCHLD (Child exited) @ 0 (0) ---
vfork(line 5
)                                 = 9171
--- SIGCHLD (Child exited) @ 0 (0) ---
vfork(line 6
)                                 = 9177
vfork()                                 = ? ERESTARTNOINTR (To be restarted)
--- SIGCHLD (Child exited) @ 0 (0) ---
vfork(line 7
)                                 = 9185
vfork()                                 = ? ERESTARTNOINTR (To be restarted)
--- SIGCHLD (Child exited) @ 0 (0) ---
vfork(  C-c C-c <unfinished ...>

論壇徽章:
11
未羊
日期:2013-12-16 12:45:4615-16賽季CBA聯(lián)賽之青島
日期:2016-04-11 19:17:4715-16賽季CBA聯(lián)賽之廣夏
日期:2016-04-06 16:34:012015亞冠之卡爾希納薩夫
日期:2015-11-10 10:04:522015亞冠之大阪鋼巴
日期:2015-07-30 18:29:402015亞冠之城南
日期:2015-06-15 17:56:392015亞冠之卡爾希納薩夫
日期:2015-05-15 15:19:272015亞冠之山東魯能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16賽季CBA聯(lián)賽之八一
日期:2016-07-22 09:41:40
7 [報告]
發(fā)表于 2011-12-05 17:55 |只看該作者
居然能維持棧平衡, 真他媽神奇。。。。什么樣的代碼能導(dǎo)致這個棧還能保持平衡呢???
zylthinking 發(fā)表于 2011-12-05 17:26


知道為啥能棧平衡了
  1. 0x00144b53 <__libc_start_main+227>:        call   *0x8(%ebp)
  2. 0x00144b56 <__libc_start_main+230>:        mov    %eax,(%esp)
  3. 0x00144b59 <__libc_start_main+233>:        call   0x15d0a0 <exit>
  4. 0x00144b5e <__libc_start_main+238>:        xor    %ecx,%ecx
  5. 0x00144b60 <__libc_start_main+240>:        jmp    0x144aa0 <__libc_start_main+48>
  6. 0x00144b65 <__libc_start_main+245>:        mov    0x37f4(%ebx),%eax
復(fù)制代碼
但為啥僵尸進程會一直存在呢???

論壇徽章:
0
8 [報告]
發(fā)表于 2011-12-05 18:06 |只看該作者
回復(fù) 7# zylthinking


    能解釋一下如何棧平衡的問題嗎? :-)

論壇徽章:
11
未羊
日期:2013-12-16 12:45:4615-16賽季CBA聯(lián)賽之青島
日期:2016-04-11 19:17:4715-16賽季CBA聯(lián)賽之廣夏
日期:2016-04-06 16:34:012015亞冠之卡爾希納薩夫
日期:2015-11-10 10:04:522015亞冠之大阪鋼巴
日期:2015-07-30 18:29:402015亞冠之城南
日期:2015-06-15 17:56:392015亞冠之卡爾希納薩夫
日期:2015-05-15 15:19:272015亞冠之山東魯能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16賽季CBA聯(lián)賽之八一
日期:2016-07-22 09:41:40
9 [報告]
發(fā)表于 2011-12-05 18:31 |只看該作者
回復(fù)  zylthinking


    能解釋一下如何棧平衡的問題嗎? :-)
J_O_H_N 發(fā)表于 2011-12-05 18:06


你首先要知道 vfork 和 fork 的區(qū)別, 簡而言之就是 父進程保證子進程退出后再運行; 并且子進程操縱的是父進程內(nèi)存空間
因此, 當(dāng)子進程 return 0 時從main 返回, 對堆棧進行彈出操作, 修改的實際上時父進程的棧, 因此, 父進程棧被破壞。
當(dāng)父進程醒來執(zhí)行時,  esp 并沒有受子進程修改他的棧的影響, 因為他的 esp, eip 等是保存再內(nèi)核棧上的, 但他棧上的內(nèi)容有可能被改寫。 因此, 所謂行為不確定就是指棧被別人改寫了, 但他不知道。
可能被改寫有一條, 就是 main 的返回地址, 因為子進程 return 時, 肯定會將它彈出到 eip 中, 然后, 這個東西會不會被改成新值, 就看子進程后面干了什么了

0x00144b53 <__libc_start_main+227>:        call   *0x8(%ebp)
0x00144b56 <__libc_start_main+230>:        mov    %eax,(%esp)
0x00144b59 <__libc_start_main+233>:        call   0x15d0a0 <exit>
0x00144b5e <__libc_start_main+238>:        xor    %ecx,%ecx
0x00144b60 <__libc_start_main+240>:        jmp    0x144aa0 <__libc_start_main+48>

這段代碼, 第一句是 call main, 會在棧上壓下第二句的地址
子進程退出時, 將壓下的返回地址彈出, 然后又 call exit, 將第四句的地址壓下
子進程不會返回來了, 在exit中就灰飛煙滅了
父進程喚醒, 由于他的 esp 是從保存的地址中恢復(fù)的, esp 的值不會變, 因此他也能執(zhí)行 if(!vfork()) 這個判斷, 雖然局部變量可能被修改了, 但這段代碼沒有引用局部變量, 沒問題。
他也執(zhí)行 return, 但它的返回地址已經(jīng)被修改成了第三句了, 就是 xor    %ecx,%ecx, 然后執(zhí)行 jmp    0x144aa0, 往回跳
于是這個結(jié)果就是
1。 它的返回地址被修改, 導(dǎo)致它錯過了 exit, 因此它不會退出
2。 它向回跳, 導(dǎo)致重新執(zhí)行main
3。 仔細觀察, 棧真的是平衡的, 只是它的返回地址被修改了而已, 因此, 無論執(zhí)行多少遍, 棧都不會亂, 他會無限這么搞下去(如果不考慮子進程數(shù)量及其他資源限制)

論壇徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-08-03 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-08-04 06:20:00
10 [報告]
發(fā)表于 2011-12-05 19:56 |只看該作者
執(zhí)行此程序后不斷產(chǎn)生Z進程:

daniel@Daniel:/usr/local/src/testsuits/0007_tiny$ ps aux | grep a.out ...
J_O_H_N 發(fā)表于 2011-12-05 16:15



    因為進程的棧結(jié)構(gòu)在不斷的被修改,正好不斷的vfork
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP