Мне нужно написать небольшую оболочку, называемую shhh, которая обладает следующими возможностями:
- Может выполнить команду с сопровождающими аргументами.
- Распознавание нескольких запросов канала и их обработка.
Пример команды:
shhh> ls | more | wc
Мне нужна конкретно помощь с трубами. Я гуглил и исследовал несколько хороших дней, как реализовать это в c, но безрезультатно. Вообще говоря, у меня есть довольно хорошее представление о том, как работает труба, но когда дело доходит до реализации этой многотрубной детали, я не имею ни малейшего понятия.
Я пытался исследовать, как это сделать и пытался реализовать его в моем коде всеми способами безрезультатно. Либо это не работает, либо я не понимаю этого и не могу заставить его работать. Я также пробовал Chegg, но их эксперты бесполезны, так как они продолжают просить больше кода, и единственное, что я оставил из приведенного ниже фрагмента, это мой собственный код, который я написал и который не имеет ничего общего с проблемой. У меня сейчас есть.
Это весь код, который имеет отношение к проблеме.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<signal.h>
#include<fcntl.h>
main()
{
char *path, *argv[20], buf[80], n, *p;
int m, status, inword, continu;
int fd[2];
while(1) {
inword = 0;
p = buf;
m = 0;
continu=0;
printf( "\nshhh> ");
while ( ( n = getchar() ) != '\n' || continu ) {
if ( n == ' ' ) {
if ( inword ) {
inword = 0;
*p++ = 0;
}
}
else if ( n == '\n' )
continu = 0;
else if ( n == '\\' && !inword )
continu = 1;
else {
if ( !inword ) {
inword = 1;
argv[m++] = p;
*p++ = n;
}
else
*p++ = n;
}
}
*p++ = 0;
argv[m] = 0;
if ( strcmp(argv[0],"exit") == 0 )
exit (0);
вот фрагмент кода, который у меня сейчас есть :
if(fork() == 0) {
for(y = 0; arg[v] != 0; y++) {
if(strcmp("|", argv[y]) == 0) {
argv[y] = 0;
pipe(fd);
if(fork() == 0) {
close(fd[0]);
dup(fd[0]);
close(fd[1]);
execvp(argv[0], argv);
}
else {
close(fd[1]);
dup(fd[1]);
close(fd[0]);
}
}
execvp(argv[0], argv);
printf(" didn't exec \n");
n2 = wait(&status);
}
wait(&status);
}
}
Любая и вся помощь очень ценится. Также я должен использовать execvp()
и массив аргументов (argv[]
).