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

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

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

[woodie等兄惠存]關(guān)于bash的管道與進(jìn)程的幾個(gè)知識(shí)點(diǎ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è)計(jì)版塊每日發(fā)帖之星
日期:2016-06-29 06:20:002017金雞報(bào)曉
日期:2017-01-10 15:19:5615-16賽季CBA聯(lián)賽之佛山
日期:2017-02-27 20:41:19
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2006-04-07 09:14 |只看該作者 |倒序?yàn)g覽
幾個(gè)知識(shí)點(diǎn)
1.Bash在實(shí)現(xiàn)pipeline(管道|)時(shí)會(huì)發(fā)起兩個(gè)subshell(子shell)來運(yùn)行|兩邊的命令,對(duì)于系統(tǒng)來說就是發(fā)起兩個(gè)childprocess(子進(jìn)程)

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

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

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



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


[ 本帖最后由 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è)計(jì)版塊每日發(fā)帖之星
日期:2016-06-29 06:20:002017金雞報(bào)曉
日期:2017-01-10 15:19:5615-16賽季CBA聯(lián)賽之佛山
日期:2017-02-27 20:41:19
2 [報(bào)告]
發(fā)表于 2006-04-07 09:15 |只看該作者

問題的發(fā)生

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

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

運(yùn)行./get_process后會(huì)得到什么結(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)生了種種解釋
其實(shí)大家離真相只有0.01mm的距離
讓我來提示一下
觀察三種結(jié)果,都有一個(gè)共同的進(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è)計(jì)版塊每日發(fā)帖之星
日期:2016-06-29 06:20:002017金雞報(bào)曉
日期:2017-01-10 15:19:5615-16賽季CBA聯(lián)賽之佛山
日期:2017-02-27 20:41:19
3 [報(bào)告]
發(fā)表于 2006-04-07 09:15 |只看該作者

我的解釋

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


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


而用3291中的ps來觀察這個(gè)進(jìn)程的時(shí)候,由于兩個(gè)子進(jìn)程的并行,每一種狀態(tài)都可能被ps看到,當(dāng)然每次只能看到一種狀態(tài)
所以結(jié)果會(huì)有三種情況
進(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è)計(jì)版塊每日發(fā)帖之星
日期:2016-06-29 06:20:002017金雞報(bào)曉
日期:2017-01-10 15:19:5615-16賽季CBA聯(lián)賽之佛山
日期:2017-02-27 20:41:19
4 [報(bào)告]
發(fā)表于 2006-04-07 09:20 |只看該作者

作業(yè)

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

論壇徽章:
7
榮譽(yù)版主
日期: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 [報(bào)告]
發(fā)表于 2006-04-07 10:49 |只看該作者
2.如果在kornshell中,這種情況會(huì)發(fā)生么?
依然會(huì)發(fā)生,除非管道中最后一個(gè)命令時(shí)內(nèi)部命令。

論壇徽章:
0
6 [報(bào)告]
發(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è)計(jì)版塊每日發(fā)帖之星
日期:2016-06-29 06:20:002017金雞報(bào)曉
日期:2017-01-10 15:19:5615-16賽季CBA聯(lián)賽之佛山
日期:2017-02-27 20:41:19
7 [報(bào)告]
發(fā)表于 2006-04-07 11:26 |只看該作者
to 7兄:
我在kornshell中測(cè)試的結(jié)果是永遠(yuǎn)都ps出兩個(gè)進(jìn)程
get_process與grep

論壇徽章:
7
榮譽(yù)版主
日期: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 [報(bào)告]
發(fā)表于 2006-04-07 12:14 |只看該作者
我的回復(fù)就是指進(jìn)程數(shù)沒有區(qū)別,為什么總是出現(xiàn)grep,可能是概率問題,也可能是ksh的機(jī)理造成的永遠(yuǎn)都是grep。

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2006-11-20 10:36 |只看該作者
ksh下沒看到
waker     3292  3290  0 08:48 pts/1    00:00:00 /bin/bash ./get_process
這個(gè)進(jìn)程的原因大概是因?yàn)榇诉M(jìn)程的cmd被寫成了ps -ef吧
由于shell腳本本身必然會(huì)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)
下測(cè)試獲得完全一樣的結(jié)論

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

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

...



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

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP