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

  免費注冊 查看新帖 |

Chinaunix

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

[woodie等兄惠存]關(guān)于bash的管道與進(jìn)程的幾個知識點 [復(fù)制鏈接]

論壇徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亞冠之浦和紅鉆
日期:2015-06-23 19:10:532015亞冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16賽季CBA聯(lián)賽之山東
日期:2016-01-31 18:25:0515-16賽季CBA聯(lián)賽之四川
日期:2016-02-16 16:08:30程序設(shè)計版塊每日發(fā)帖之星
日期:2016-06-29 06:20:002017金雞報曉
日期:2017-01-10 15:19:5615-16賽季CBA聯(lián)賽之佛山
日期:2017-02-27 20:41:19
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2006-04-07 09:14 |只看該作者 |倒序瀏覽
幾個知識點
1.Bash在實現(xiàn)pipeline(管道|)時會發(fā)起兩個subshell(子shell)來運行|兩邊的命令,對于系統(tǒng)來說就是發(fā)起兩個childprocess(子進(jìn)程)

2.fork是產(chǎn)生process的唯一途徑,exec*是執(zhí)行程序的唯一途徑

3.子進(jìn)程會完全復(fù)制父進(jìn)程,除了$PID與$PPID

4.fork子進(jìn)程時繼承父進(jìn)程的進(jìn)程名,在exec*執(zhí)行命令時才由exec*替換為子進(jìn)程對應(yīng)的命令,同一進(jìn)程的命令名可以由一個個exec*任意多次的改變



[注]對于linux平臺,JB上就是這樣的,其它平臺不好發(fā)表意見,當(dāng)然對于2中的兩個唯一有一個例外,就是在kenerl  init的初期;
暫時找不到相關(guān)參考,也沒有功力讀源碼,所以此論是道聽途說級別,錯誤之處請指出改正,如果沒有改正的價值可一笑而過


[ 本帖最后由 waker 于 2006-4-7 09:17 編輯 ]

論壇徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亞冠之浦和紅鉆
日期:2015-06-23 19:10:532015亞冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16賽季CBA聯(lián)賽之山東
日期:2016-01-31 18:25:0515-16賽季CBA聯(lián)賽之四川
日期:2016-02-16 16:08:30程序設(shè)計版塊每日發(fā)帖之星
日期:2016-06-29 06:20:002017金雞報曉
日期:2017-01-10 15:19:5615-16賽季CBA聯(lián)賽之佛山
日期:2017-02-27 20:41:19
2 [報告]
發(fā)表于 2006-04-07 09:15 |只看該作者

問題的發(fā)生

當(dāng)時的情況是:大家在討論一個與進(jìn)程統(tǒng)計的問題
http://www.72891.cn/viewthread.php?tid=731435&extra=page%3D1
思考了一刻鐘后我作了一個習(xí)慣性的決定:簡化一下這個問題
下面的腳本 get_process

  1. #!/bin/bash
  2. ps -ef|grep get_process
復(fù)制代碼

運行./get_process后會得到什么結(jié)果

結(jié)果有三種

  1. waker     3260  3193  0 08:47 pts/1    00:00:00 /bin/bash ./get_process
復(fù)制代碼

  1. waker     3290  3193  0 08:48 pts/1    00:00:00 /bin/bash ./get_process
  2. waker     3292  3290  0 08:48 pts/1    00:00:00 /bin/bash ./get_process
復(fù)制代碼

  1. waker     3263  3193  0 08:48 pts/1    00:00:00 /bin/bash ./get_process
  2. waker     3265  3263  0 08:48 pts/1    00:00:00 grep get_process
復(fù)制代碼

大家產(chǎn)生了種種解釋
其實大家離真相只有0.01mm的距離
讓我來提示一下
觀察三種結(jié)果,都有一個共同的進(jìn)程,就是PPID 是3193的 /bin/bash ./get_process
那么3193是什么
只要echo $$就可以看出3193就是我們鍵入 ./get_process的shell

論壇徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亞冠之浦和紅鉆
日期:2015-06-23 19:10:532015亞冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16賽季CBA聯(lián)賽之山東
日期:2016-01-31 18:25:0515-16賽季CBA聯(lián)賽之四川
日期:2016-02-16 16:08:30程序設(shè)計版塊每日發(fā)帖之星
日期:2016-06-29 06:20:002017金雞報曉
日期:2017-01-10 15:19:5615-16賽季CBA聯(lián)賽之佛山
日期:2017-02-27 20:41:19
3 [報告]
發(fā)表于 2006-04-07 09:15 |只看該作者

我的解釋

讓我們參照四個知識點來解釋這個現(xiàn)象
首先當(dāng)前shell 3193發(fā)起一個subshell來執(zhí)行腳本./get_process
這個進(jìn)程pid 3290 進(jìn)程名 /bin/bash ./get_process
然后當(dāng)它遇到管道,將發(fā)起兩個子進(jìn)程 3291(用來執(zhí)行ps) 3192(用來執(zhí)行g(shù)rep),這兩個進(jìn)程是并行的
讓我們給3192來個慢鏡頭


  1.            史前時代                   fork                                       exec*(grep.*)
  2. pid          N/A                               3192
  3. 進(jìn)程名       N/A        /bin/bash ./get_process                  grep get_process
  4. 說明         N/A       這個進(jìn)程名繼承自父進(jìn)程                          exec*將進(jìn)程名替換
復(fù)制代碼


而用3291中的ps來觀察這個進(jìn)程的時候,由于兩個子進(jìn)程的并行,每一種狀態(tài)都可能被ps看到,當(dāng)然每次只能看到一種狀態(tài)
所以結(jié)果會有三種情況
進(jìn)程3290(/bin/bash ./get_process)
與下面三種可能的組合
1.空
2.子進(jìn)程3292 進(jìn)程名 /bin/bash ./get_process
3.子進(jìn)程3292 進(jìn)程名 grep get_process

[ 本帖最后由 waker 于 2006-4-7 09:18 編輯 ]

論壇徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亞冠之浦和紅鉆
日期:2015-06-23 19:10:532015亞冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16賽季CBA聯(lián)賽之山東
日期:2016-01-31 18:25:0515-16賽季CBA聯(lián)賽之四川
日期:2016-02-16 16:08:30程序設(shè)計版塊每日發(fā)帖之星
日期:2016-06-29 06:20:002017金雞報曉
日期:2017-01-10 15:19:5615-16賽季CBA聯(lián)賽之佛山
日期:2017-02-27 20:41:19
4 [報告]
發(fā)表于 2006-04-07 09:20 |只看該作者

作業(yè)

1.如何避免發(fā)起不想要的subshell?
2.如果在kornshell中,這種情況會發(fā)生么?

論壇徽章:
7
榮譽版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07獅子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10雙子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
5 [報告]
發(fā)表于 2006-04-07 10:49 |只看該作者
2.如果在kornshell中,這種情況會發(fā)生么?
依然會發(fā)生,除非管道中最后一個命令時內(nèi)部命令。

論壇徽章:
0
6 [報告]
發(fā)表于 2006-04-07 11:05 |只看該作者
1.如何避免發(fā)起不想要的subshell?
定義變量,雖然很笨但應(yīng)該可以解決問題

論壇徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亞冠之浦和紅鉆
日期:2015-06-23 19:10:532015亞冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16賽季CBA聯(lián)賽之山東
日期:2016-01-31 18:25:0515-16賽季CBA聯(lián)賽之四川
日期:2016-02-16 16:08:30程序設(shè)計版塊每日發(fā)帖之星
日期:2016-06-29 06:20:002017金雞報曉
日期:2017-01-10 15:19:5615-16賽季CBA聯(lián)賽之佛山
日期:2017-02-27 20:41:19
7 [報告]
發(fā)表于 2006-04-07 11:26 |只看該作者
to 7兄:
我在kornshell中測試的結(jié)果是永遠(yuǎn)都ps出兩個進(jìn)程
get_process與grep

論壇徽章:
7
榮譽版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07獅子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10雙子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
8 [報告]
發(fā)表于 2006-04-07 12:14 |只看該作者
我的回復(fù)就是指進(jìn)程數(shù)沒有區(qū)別,為什么總是出現(xiàn)grep,可能是概率問題,也可能是ksh的機理造成的永遠(yuǎn)都是grep。

論壇徽章:
0
9 [報告]
發(fā)表于 2006-11-20 10:36 |只看該作者
ksh下沒看到
waker     3292  3290  0 08:48 pts/1    00:00:00 /bin/bash ./get_process
這個進(jìn)程的原因大概是因為此進(jìn)程的cmd被寫成了ps -ef吧
由于shell腳本本身必然會fork process,就不必監(jiān)控了,可以改成
  1. #!/bin/bash
  2. ps -ef|grep -w ps
復(fù)制代碼

這樣來看,應(yīng)該更清楚。
在我的環(huán)境
FC6
bash(GNU bash, version 3.1.17(1)-release (i686-redhat-linux-gnu))
ksh(  version         sh (AT&T Labs Research) 1993-12-28 r)
下測試獲得完全一樣的結(jié)論

論壇徽章:
0
10 [報告]
發(fā)表于 2008-09-12 18:58 |只看該作者
原帖由 waker 于 2006-4-7 09:14 發(fā)表
幾個知識點
1.Bash在實現(xiàn)pipeline(管道|)時會發(fā)起兩個subshell(子shell)來運行|兩邊的命令,對于系統(tǒng)來說就是發(fā)起兩個childprocess(子進(jìn)程)

2.fork是產(chǎn)生process的唯一途徑,exec*是執(zhí)行程序的唯一途徑

...



這第三條太武斷了,除了PID和PPID外,還有好多不同
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(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