Tôi cần tạo hai quy trình con. Một đứa trẻ cần phải chạy lệnh "ls -al" và chuyển hướng đầu ra của nó đến đầu vào của tiến trình con tiếp theo, do đó sẽ chạy lệnh "sort -r -n -k 5" trên dữ liệu đầu vào của nó. Cuối cùng, quá trình cha mẹ cần phải đọc (dữ liệu đã được sắp xếp) và hiển thị nó trong thiết bị đầu cuối. Kết quả cuối cùng trong thiết bị đầu cuối (khi thực thi chương trình) phải giống như khi tôi nhập lệnh sau đây trực tiếp trong trình bao: "ls -al | sort -r -n -k 5". Đối với điều này tôi cần phải sử dụng các phương pháp sau đây: pipe(), fork(), execlp().pipe() và fork() trong c
Biên dịch chương trình của tôi, nhưng tôi không nhận được kết quả mong muốn cho thiết bị đầu cuối. Tôi không biết có gì sai. Đây là mã số:
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main()
{
int fd[2];
pid_t ls_pid, sort_pid;
char buff[1000];
/* create the pipe */
if (pipe(fd) == -1) {
fprintf(stderr, "Pipe failed");
return 1;
}
/* create child 2 first */
sort_pid = fork();
if (sort_pid < 0) { // error creating Child 2 process
fprintf(stderr, "\nChild 2 Fork failed");
return 1;
}
else if(sort_pid > 0) { // parent process
wait(NULL); // wait for children termination
/* create child 1 */
ls_pid = fork();
if (ls_pid < 0) { // error creating Child 1 process
fprintf(stderr, "\nChild 1 Fork failed");
return 1;
}
else if (ls_pid == 0) { // child 1 process
close(1); // close stdout
dup2(fd[1], 1); // make stdout same as fd[1]
close(fd[0]); // we don't need this end of pipe
execlp("bin/ls", "ls", "-al", NULL);// executes ls command
}
wait(NULL);
read(fd[0], buff, 1000); // parent reads data
printf(buff); // parent prints data to terminal
}
else if (sort_pid == 0) { // child 2 process
close(0); // close stdin
dup2(fd[0], 0); // make stdin same as fd[0]
close(fd[1]); // we don't need this end of pipe
execlp("bin/sort", "sort", "-r", "-n", "-k", "5", NULL); // executes sort operation
}
return 0;
}
Trừ khi nếu bạn đang thực thi từ '/', hãy thử thay thế "bin/ls" bằng "/ bin/ls" (tương tự cho "/ bin/sort") – wildplasser
Dường như bạn đang không kiểm tra lỗi. Bạn nên thêm một số, điều đó sẽ giúp bạn chẩn đoán vấn đề. –
Tôi có các câu lệnh printf() bên trong các khối con. Không có "/", nó cho tôi thấy cả hai câu lệnh con nhưng khi tôi đặt "/" nó không hiển thị những câu lệnh đó; nó giống như là nó không chạm đến các khối trẻ em. – user2443819