我正在開發一個自定義外殼。在這個作業中,我需要實作類似 uniq 的命令。給定已排序的行,uniq應該能夠列印所有唯一值和(如果命令是uniq -c ,則它們的出現次數)。示例代碼在最后說明。
我對演算法沒有問題。我寫了一個函式,它可以與所需的操作完全相同。然而,問題是,這些型別的輸出和輸入是什么?我的意思是當我命令cat input.txt時,這些行只是一個字串還是以陣列形式給出?正如我所說,演算法還可以,但我不知道如何在 shell 中應用正確的演算法?任何幫助或想法表示贊賞。
$cat input.txt
Cinnamon
Egg
Egg
Flour
Flour
Flour
Milk
Milk
$cat input.txt | uniq
Cinnamon
Egg
Flour
Milk
uj5u.com熱心網友回復:
這些行只是一個字串還是在陣列中給出
這些行是 fork 的結果,只是已發送到stdout.
getline在這些情況下非常有用,現在你有了演算法,你只需要處理cat.
一個例子:
#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
int main(void)
{
char *str = NULL;
size_t size = 0;
ssize_t len = 0;
int line = 1;
while ((len = getline(&str, &size, stdin)) != -1)
{
printf("-) length = %2zd | %s", line , len, str);
}
free(str);
return 0;
}
gcc -o demo demo.c
cat demo.c | ./demo
輸出:
1) length = 32 | #define _POSIX_C_SOURCE 200809L
2) length = 1 |
3) length = 19 | #include <stdio.h>
4) length = 20 | #include <stdlib.h>
5) length = 23 | #include <sys/types.h>
6) length = 1 |
7) length = 15 | int main(void)
8) length = 2 | {
9) length = 22 | char *str = NULL;
10) length = 21 | size_t size = 0;
11) length = 21 | ssize_t len = 0;
12) length = 18 | int line = 1;
13) length = 1 |
14) length = 54 | while ((len = getline(&str, &size, stdin)) != -1)
15) length = 6 | {
16) length = 61 | printf("-) length = %2zd | %s", line , len, str);
17) length = 6 | }
18) length = 15 | free(str);
19) length = 14 | return 0;
20) length = 2 | }
21) length = 1 |
uj5u.com熱心網友回復:
格式是位元組序列。如何存盤取決于您。您的設計選擇。
cat input.txt打開檔案input.txt并讀取位元組并將它們發送到“螢屏”(標準輸出)。
uniq從“鍵盤”(標準輸入)讀取位元組并......做獨特的事情。并將輸出發送到“螢屏”。如果需要,您可以自己嘗試 -uniq自行運行,或者uniq -c- 停止命令并使其處理最后一行,按 Enter 完成該行,然后按 Ctrl-D。
當您執行cat input.txt | uniqshell 運行cat input.txt時,它會運行uniq,但會將cat“螢屏”重定向到uniq“鍵盤”。所以就像你跑步cat input.txt,然后不管它顯示什么,你把它輸入到uniq.
據我了解,您正在撰寫一個“假裝”外殼,而您的外殼實際上不會運行這兩個命令并連接它們,因此您對如何執行此操作不感興趣,而對如何模擬它不感興趣。
需要注意的是位元組直接從cat到uniq。它不會先將它們全部保存到流中。因此,如果第一個命令是一個緩慢的命令,uniq將能夠在它們準備好后立即處理這些行,并且它不必等待第一個命令完成就可以開始執行 uniq 的東西。使用您的cat命令,您無法區分,除非檔案非常大并且不適合字串,但您可能會在其他命令中注意到它。
對于您的假裝 shell,按順序通過所有命令一次處理一行可能是最簡單的。
uj5u.com熱心網友回復:
當我命令cat input.txt時,這些行只是一個字串還是以陣列形式給出?
如果您正在執行外部cat命令*,則輸出將寫入該命令的標準輸出。這是 I/O,而不是共享記憶體。一旦這些資料從中出現cat,就不再適合根據用于它們的任何內部資料結構cat來描述它們。它們只是一個字符序列。如果另一個命令使用這些資料,那么它會選擇自己的資料結構來處理它們。
您將如何uniq使用這些資料?兩種方式之一:
的輸出
cat將被重定向到一個檔案,該檔案uniq隨后將打開并讀取。cat input.txt > temp; uniq temp或者
的輸出
cat將被重定向到 的標準輸入uniq。cat input.txt | uniq
每個 I/O 端點在邏輯上都是一個檔案,因此可以或多或少地處理相同,這是 UNIX 的組織原則之一。在情況 (1) 中,您將使用open()或fopen()命名檔案,而在情況 (2) 中,您將使用預連接的檔案描述符 0 或stdin流,但是一旦您決定使用其中的哪一個,這兩種方式都是相同的。
*如果您正在執行自己的內部操作cat,那么您比我們更了解細節。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/530475.html
標籤:C壳独特的
