The reason is that you are casting more processes than you planned. When you do:
childls_pid = fork();
childSort_pid = fork();
fork() , , fork(). , :
parent
childls
childSort
childSort
childls childls->childSort, childls_pid 0, case 0:, executeLs().
fork , . switch.
, FD FD, , , , , . , EOF .
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
void executeLs(int data_pipe[]);
void executeSort(int data_pipe[]);
int main(){
int data_pipe[2];
int childls_pid;
int childSort_pid;
int rc;
int child_status1;
int child_status2;
rc = pipe(data_pipe);
if(rc == -1){
perror("pipe");
exit(1);
}
childls_pid = fork();
switch(childls_pid) {
case -1:
perror("fork childLs Error");
exit(1);
case 0:
executeLs(data_pipe);
exit(0);
default:
break;
}
childSort_pid = fork();
switch(childSort_pid) {
case -1:
perror("fork childSort Error");
exit(1);
case 0:
executeSort(data_pipe);
exit(0);
default:
wait(&child_status2);
}
return 0;
}
void executeLs(int data_pipe[]){
close(data_pipe[0]);
dup2(data_pipe[1], STDOUT_FILENO);
close(data_pipe[1]);
execlp("ls", "ls", "-1", NULL);
}
void executeSort(int data_pipe[]){
close(data_pipe[1]);
dup2(data_pipe[0], STDIN_FILENO);
close(data_pipe[0]);
execlp("sort","sort", NULL);
}