Моя задача - написать программу на языке C, которая выполняет команду «ls -l/bin/?? | grep rwxr-xr-x | sort». Существует 3 дочерних процесса, каждый из которых выполняет одну из команд отдельно и отправляет результат через канал в следующий дочерний процесс. Я использую шведскую модифицированную версию debian, поэтому сообщение об ошибке на шведском языке, но я переведу ошибку, которую я получаю, это что-то вроде строк: sort: failed to status -: unknown fileidentifier.Трубы в c linux для подключения 3 процессов для выполнения команды
Возможно, это мои трубы, которые не работают должным образом, я не слишком уверен в командах close(). Я уверен, что ошибка исходит из труб. Был бы признателен, если бы кто-то мог запустить программу и получить сообщение об ошибке на английском языке.
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <assert.h>
#include <errno.h>
#include <string.h>
int main()
{
int ret;
int fds1[2], fds2[2], fds3[2];
char buf[20];
pid_t pid;
///initiating pipes
ret=pipe(fds1);
if(ret == -1){
perror("could not pipe");
exit(1);
}
ret=pipe(fds2);
if(ret == -1){
perror("could not pipe");
exit(1);
}
ret=pipe(fds3);
if (ret == -1){
perror("could not pipe");
exit(1);
}
pid=fork();
if(pid==-1){
fprintf(stderr,"fork failed");
exit(0);
}
if(pid==0){
///CHILD 1
close(1);
dup(fds1[1]);
close(fds1[0]);
close(fds1[1]);
close(0);
execlp("/bin/sh","bin/sh", "ls-l /bin/??", (char *)NULL);
}
else{
wait(0);
}
pid=fork();
if(pid==-1){
fprintf(stderr,"fork failed");
exit(0);
}
if(pid==0){
close(0);
dup(fds1[0]);
close(fds1[0]);
close(fds1[1]);
close(1);
dup(fds2[1]);
close(fds2[0]);
close(fds2[1]);
execlp("/usr/share/grep/", "grep", "rwxr-xr-x", NULL);
}
else{
wait(0);
}
close(fds1[0]);
close(fds1[1]);
pid=fork();
if(pid==-1){
fprintf(stderr,"fork failed");
exit(0);
}
if(pid==0){
close(0);
dup(fds2[0]);
close(fds2[0]);
close(fds2[1]);
execlp("sort", "sort", NULL);
}
else{
wait(0);
}
close(fds2[0]);
close(fds2[1]);
}
Извините за комментарий к коду на шведском языке, забыл изменить его, и я здесь новый, не знаю, как отредактировать свой текст сейчас, когда он опубликован. В любом случае, последняя команда execlp, которую я знаю, определенно неверна. Any1 умеет запускать сортировку с помощью execlp? –
Существует ссылка «изменить» под текстом вашего вопроса и тегами слева. Нажмите, чтобы изменить свой вопрос. –
«p» в 'execlp' означает, что он автоматически ищет путь, поэтому вы можете просто указать' execlp («sort», «sort», NULL); 'without path. –