以下代码的目的是创建2个子进程。其中一个将执行' ls'。另一个将执行' sort'使用' ls'的输出。两个孩子的过程都是通过管道实现的。但是,代码有效,输出格式并不完全符合我的预期。
代码: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
*我尝试用 ls -l |进行测试排序,然后 ./ minishell (在添加&#34; -l&#34;当然是第一个孩子的execlp之后),输出相同,除了&#39 ; /&#39;从每个文件夹名称中删除。
我的假设是它与管道有关。我认为这两个过程都是&#39; ls&#39;和&#39;排序&#39;在隔离工作正常。但是,当其中一个写入/读取管道时,某些事情会变坏。我已经尝试过很难找到潜在的问题但无济于事。任何帮助将不胜感激。提前谢谢。
答案 0 :(得分:0)
输出很好,尝试切换终端,侧面注意42sh比minishell更难,不要在minishell上实现42sh你将不得不做大量的返工。