macOS.標(biāo)準(zhǔn)輸入輸出

每個(gè)程序啟動(dòng)后都有標(biāo)準(zhǔn)輸入(standard in),標(biāo)準(zhǔn)輸出(standard out)還有標(biāo)注出錯(cuò)(standard error)辨嗽。

要說(shuō)明的是 macOS 里的「終端(Terminal)」應(yīng)用和標(biāo)準(zhǔn)輸入(standard in)和標(biāo)準(zhǔn)輸出(standard out)沒(méi)有什么必然聯(lián)系世落。如果你認(rèn)為他們可能存在什么聯(lián)系的話,那可能是因?yàn)槟銊傞_始學(xué) c 程序的時(shí)候經(jīng)常在終端里運(yùn)行程序糟需,誤以為終端的輸出就是你的標(biāo)準(zhǔn)輸出屉佳。

我們?cè)趺纯礃?biāo)準(zhǔn)輸出呢?

示例程序:

NSFileHandle *stdOutput = NSFileHandle.fileHandleWithStandardOutput;
NSData *outputData = [@"fan's world\n" dataUsingEncoding:NSUTF8StringEncoding];
[stdOutput writeData:outputData];

這段程序可以在不同的環(huán)境下運(yùn)行

  • 如果是用 Xcode 調(diào)試的話洲押,終端輸出默認(rèn)就是 Xcode 的調(diào)試終端武花。
  • 如果是通過(guò)「終端(Terminal)」啟動(dòng)編譯好的應(yīng)用的話,那可以在 「終端(Terminal)」里看到終端輸出

是不是覺(jué)得這么輸出很眼熟杈帐,跟 printf 和 nslog 啥的輸入很類似呢体箕?后續(xù)會(huì)說(shuō)到這個(gè)問(wèn)題。

但是我們觀察到一個(gè)現(xiàn)象就是標(biāo)準(zhǔn)輸出(standard out)的東西并不會(huì)出現(xiàn)在 macOS 的 「Console.app」 下挑童,也有人問(wèn)過(guò)類似的問(wèn)題:

答案:

Prior to Mountain Lion, all processes managed by launchd, including regular applications, had their stdout and stderr file descriptors forwarded to the system log. In Mountain Lion and above, stdout and stderr go nowhere for launchd managed applications. Only messages explicitly sent to the system log will end up there.
If you're writing an application and would like some output to show up in the console, then adopt an API built on syslog(3) or asl(3) instead. NSLog is one such API, and it has the advantage of logging to stderr too so you can easily see your output no matter how you've launched your application. If you'd like that functionality but want to use asl or syslog directly then you'll want to look in to the ASL_OPT_STDERR option to asl_open, and the LOG_PERROR option to open log respectively.
看起來(lái)是和系統(tǒng)有關(guān)系累铅。在 Mountain Lion 后需要采用建立在 syslog 或者 asl(apple system log) 上的 API。NSLog 就是這樣的..

那標(biāo)準(zhǔn)輸出(standard out)究竟去哪了……
我們可以看下 I/O stream 的官方說(shuō)明:

The <stdio.h> header provides generic file operation support and supplies functions with narrow character input/output capabilities.
I/O streams are objects of type FILE that can only be accessed and manipulated through pointers of type FILE* (Note: while it may be possible to create a local object of type FILE by dereferencing and copying a valid FILE*, using the address of such copy in the I/O functions is undefined behavior). Each stream is associated with an external physical device (file, standard input stream, printer, serial port, etc).
I/O 流的本質(zhì)以及其說(shuō)明站叼,每個(gè)輸入輸出流都關(guān)聯(lián)了一個(gè)外部的物理設(shè)備…..
I/O streams can be used for both unformatted and formatted input and output. They are locale-sensitive and may perform wide/multibyte conversions as necessary. All streams access the same locale object: the one most recently installed with setlocale.

所以娃兽,標(biāo)準(zhǔn)輸出應(yīng)該是打印到屏幕上了。那標(biāo)準(zhǔn)輸入呢尽楔,這里的話很明顯就是鍵盤了换薄。

再進(jìn)一步,printf 和 nslog 有啥區(qū)別呢?

我們可以觀察到 printf 打印的內(nèi)容并不會(huì)輸出到 macOS 的「Console.app」里翔试,但是 NSLog 會(huì)。

我們看一下 printf 的官方說(shuō)明

printf : Writes the results to the output stream stdout.
可以看到 printf 和標(biāo)準(zhǔn)輸出其實(shí)就是一回事兒...

/dev/stdout 是什么呢?

其實(shí)是一個(gè)設(shè)備文件复旬,是指向 /proc/self/fd/1 的鏈接文件垦缅。

參考地址 https://stackoverflow.com/questions/30780780/difference-between-stdout-and-dev-stdout

Device-File :
In Unix-like operating systems, a device file or special file is an interface for a device driver that appears in a file system as if it were an ordinary file.** There are also special files in MS-DOS, OS/2, and Microsoft Windows.
作用: They allow software to interact with a device driver using standard input/output system calls, which simplifies many tasks and unifies user-space I/O mechanisms.
人模狗樣兒的像個(gè)文件似的,其實(shí)不是驹碍。只是為了軟件和設(shè)備驅(qū)動(dòng)打交道而已壁涎。
On the other hand, /dev/stdout is a link to a special file on the procfs file system, which represents file descriptor 1 of the process using it1.

參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市志秃,隨后出現(xiàn)的幾起案子怔球,更是在濱河造成了極大的恐慌,老刑警劉巖浮还,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竟坛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)担汤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門涎跨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人崭歧,你說(shuō)我怎么就攤上這事隅很。” “怎么了率碾?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵叔营,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我所宰,道長(zhǎng)绒尊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任歧匈,我火速辦了婚禮垒酬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘件炉。我一直安慰自己勘究,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布斟冕。 她就那樣靜靜地躺著口糕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪磕蛇。 梳的紋絲不亂的頭發(fā)上景描,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音秀撇,去河邊找鬼超棺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛呵燕,可吹牛的內(nèi)容都是我干的棠绘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼再扭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼氧苍!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起泛范,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤让虐,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后罢荡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赡突,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡对扶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了麸俘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辩稽。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖从媚,靈堂內(nèi)的尸體忽然破棺而出逞泄,到底是詐尸還是另有隱情,我是刑警寧澤拜效,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布喷众,位于F島的核電站,受9級(jí)特大地震影響紧憾,放射性物質(zhì)發(fā)生泄漏到千。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一赴穗、第九天 我趴在偏房一處隱蔽的房頂上張望憔四。 院中可真熱鬧,春花似錦般眉、人聲如沸了赵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)柿汛。三九已至,卻和暖如春埠对,著一層夾襖步出監(jiān)牢的瞬間络断,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工项玛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留貌笨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓襟沮,卻偏偏與公主長(zhǎng)得像躁绸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子臣嚣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 君生我未生硅则,我生君已老。 古代的很多女子想必也是大叔控株婴,君恨我生遲怎虫,我恨君生早暑认。 當(dāng)年,一部《北京遇上西雅圖》讓波...
    彭晨龍閱讀 602評(píng)論 0 1
  • 我大約兩年前開始在家里種花大审。先從超市里買了一個(gè)金屬架裝配起來(lái)蘸际,然后就開始陸陸續(xù)續(xù)從花卉市場(chǎng)買來(lái)各種便宜常見的植物花...
    伊蔥閱讀 793評(píng)論 5 4