2016-11-20 63 views
0

以下代碼的用途是創建2個子進程。其中一個將執行'ls'。另一個將使用'ls'的輸出執行'排序'。兩個兒童進程都通過管道來實現這一點。代碼工作,但是,輸出格式不是我所期望的。管道過程的輸出與預期不完全相同。爲什麼? (C,UNIX)

代碼:minishell.c

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/wait.h> 

`int main() 
{ 
    int fd[2]; 
    pipe(fd);` 

    //First child process created: ls 
    if (fork() == 0) { 
     /*child */ 
     close(fd[0]); 
     dup2(fd[1], STDOUT_FILENO); 
     close(fd[1]); 
     execlp("ls", "ls", (char *)0); 
      fprintf(stderr, "execlp(ls) failed\n"); 
      exit(1); 
     } 

    wait(NULL); 

    //Second child process created: sort 
    if (fork() == 0) { 
     close(fd[1]); 
     dup2(fd[0], STDIN_FILENO); 
     close(fd[0]); 
     execlp("sort", "sort", (char *)0); 
     fprintf(stderr, "execlp(sort) failed\n"); 
     exit(1); 
     } 

    close(fd[0]); 
    close(fd[1]); 

    wait(NULL); 
    fprintf(stderr, "parent done\n"); 

    return 0; 

} 

預期輸出:LS |排序

8.bmp  bmplib.h  Downloads/ lab4.c  Music/  tester 
appData/ bmptool.c  example.bmp Makefile  myls.c  testfile.c 
bitcount.c Documents/ infile  minishell.c Pictures/ Videos/ 
bitcount* Desktop/  fork.c  minishell* myshell.c Testfile.txt 
bmplib.c doublefork.c lab4*  Movies/  temp/ 

我的輸出:./minishell

8.bmp 
appData 
bitcount 
bitcount.c 
bmplib.c 
bmplib.h 
bmptool.c 
Desktop 
Documents 
doublefork.c 
Downloads 
example.bmp 
fork.c 
infile 
lab4 
lab4.c 
Makefile 
minishell 
minishell.c 
Movies 
Music 
myls.c 
myshell.c 
Pictures 
temp 
tester 
testfile.c 
Testfile.txt 
Videos 
parent done 
  1. 爲什麼格式化兩種情況之間有什麼不同?
  2. 在./minishell的情況下,爲什麼要從所有文件夾名稱中刪除「/」?
  3. 的情況下|排序,爲什麼某些文件夾出現在'myshell.c'之前的'Pictures /';'Testfile.txt'之前的'Videos /')顯然不符合字典順序?

*我試過用ls -l |排序,然後./minishell(將第一個孩子的execlp當然添加「-l」後),輸出結果是相同的,除了從每個文件夾名稱中刪除「/」。

我的假設是它與管道有關。我認爲這兩個過程,孤立的'ls'和'sort'工作都很好。然而,當其中一個寫入/讀取管道時發生了一些問題。我非常努力地找到潛在的問題無濟於事。任何幫助將不勝感激。提前致謝。

回答

0

輸出正常,嘗試切換終端,旁註42sh比minishell更難,不要在minishell上實現,因爲42sh你必須做大量的返工。

相關問題