Shell

cat 進入標準輸入然後管道進入程序保持分叉的外殼打開,為什麼?

  • July 22, 2016

我不確定發生了什麼,但我一直在嘗試了解輸入和輸出發生了什麼。所以這是我的程序。

#include <stdio.h>
#include <stdlib.h>
int main(){
   char pass[8];
   fgets(pass, 8, stdin);
   if (pass[1] == 'h'){
       printf("enter shell\n");
       system("/bin/bash");
       printf("leave shell\n");
   }
   return 0;
}

這裡有一些終端命令。當我定期執行它並輸入“hh”時,外殼保持打開狀態。

idkanything ~ $ ./a.out
hh
enter shell
bash-3.2$

現在我嘗試回顯然後管道,但外殼立即關閉。

idkanything ~ $ echo "hh" | ./a.out
enter shell
leave shell

所以現在是它的工作時間:

idkanything ~ $ cat <(python -c 'print "hh"') - | ./a.out
enter shell
this work
/bin/bash: line 1: this: command not found
leave shell

但是,當我為標準輸入省略“-”時,它不起作用,因為外殼會立即關閉。

idkanything ~ $ cat <(python -c 'print "hh"') | ./a.out
enter shell
leave shell

當我在這裡最後有 cat 時,它也可以工作。

idkanything ~ $ (python -c 'print "hh"'; cat) | ./a.out
enter shell
this works
/bin/bash: line 1: this: command not found
leave shell

有人可以解釋發生了什麼嗎?使 shell 保持打開狀態的命令具體是什麼?為什麼 shell 只對這些命令保持打開狀態,而不對其他命令(例如回顯“hh”然後通過管道輸入)保持打開狀態。

我相信它可能與標準輸出有關。

對於它“工作”的情況,您正在執行**cat一個正在讀取標準輸入的程序,該輸入尚未關閉。由於它尚未(尚未)關閉,因此cat**繼續執行,使其標準輸出保持打開狀態,供 shell 使用(也未關閉)。

引用自:https://unix.stackexchange.com/questions/297560