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
- 爲什麼格式化兩種情況之間有什麼不同?
- 在./minishell的情況下,爲什麼要從所有文件夾名稱中刪除「/」?
- 在的情況下|排序,爲什麼某些文件夾出現在'myshell.c'之前的'Pictures /';'Testfile.txt'之前的'Videos /')顯然不符合字典順序?
*我試過用ls -l |排序,然後./minishell(將第一個孩子的execlp當然添加「-l」後),輸出結果是相同的,除了從每個文件夾名稱中刪除「/」。
我的假設是它與管道有關。我認爲這兩個過程,孤立的'ls'和'sort'工作都很好。然而,當其中一個寫入/讀取管道時發生了一些問題。我非常努力地找到潛在的問題無濟於事。任何幫助將不勝感激。提前致謝。