Tôi đang cố tạo một trình bao đơn giản trong C cho Unix. Tôi đã có thể làm tất cả việc phân tích cú pháp các lệnh và thực thi, nhưng tôi đang gặp vấn đề với đường ống. Tôi nghĩ rằng vấn đề là tôi không hooking vào đúng ống cho đầu vào của lệnh thứ hai.Sự cố với các lệnh đường ống trong C
Ví dụ: nếu tôi nhập "ls | wc", nó sẽ tạm dừng sau lệnh "wc", điều mà tôi nghĩ là do chờ đợi đầu vào. Tôi nghĩ rằng vấn đề là khi tôi sử dụng dup2 (đọc [i], 0), và nó không hooking vào đúng ống.
Tôi biết đây là một câu hỏi rộng, nhưng nếu có bất kỳ gợi ý nào tôi có thể nhận được, tôi sẽ đánh giá cao nó. Đây là đoạn mã tạo ra các quy trình mới và cố gắng làm chúng.
int fileds[2];
int reading[num_cmds];
int writing[num_cmds];
int p;
for(p=0; p < num_cmds; p++)
{
reading[p] = -1;
writing[p] = -1;
}
int j;
for(j=0; j < num_cmds-1; j++) //Create pipes for commands
{
int fileds[2];
pipe(fileds);
reading[j+1] = fileds[0];
writing[j] = fileds[1];
}
int i = 0;
for(i = 0; i < num_cmds;i++)
{
cmd_args = parse_cmd(cmds[i],output_file,input_file,&run_bg); //Get command and args
pid_t childpid;
int status;
childpid=fork();
if (childpid >= 0)
{
if (childpid == 0)
{
if(writing[i] != -1)
{
dup2(writing[i],1);
close(writing[i]);
}
if(reading[i] != -1)
{
dup2(reading[i],0);
close(reading[i]);
}
int h;
for(h = 0; h < num_cmds; h++)
{
close(writing[h]);
close(reading[h]);
}
if(execvp(cmd_args[0],cmd_args) == -1)
{
perror("Problem with command");
exit(0);
}
}
else
{
wait(&status);
int m;
for(m = 0; m < num_cmds; m++)
{
if(writing[m] != -1) close(writing[m]);
if(reading[m] != -1) close(reading[m]);
}
}
}
else
{
perror("fork");
continue;
}
input_file[0] = 0;
output_file[0] = 0;
run_bg = 0;
}
}
UPDATE: tôi đã có thể hình dung nó ra, nhờ Richard. Đó là sự kết hợp của việc đóng các bộ mô tả tập tin theo thứ tự sai và không đóng một chút nào. Đây là mã làm việc.
int fileds[2];
int reading[num_cmds];
int writing[num_cmds];
int p;
for(p=0; p < num_cmds; p++)
{
reading[p] = -1;
writing[p] = -1;
}
int j;
for(j=0; j < num_cmds-1; j++)
{
int fileds[2];
pipe(fileds);
reading[j+1] = fileds[0];
writing[j] = fileds[1];
}
int i = 0;
for(i = 0; i < num_cmds;i++)
{
cmd_args = parse_cmd(cmds[i],output_file,input_file,&run_bg);
pid_t childpid;
int status;
childpid=fork();
if (childpid >= 0)
{
if (childpid == 0)
{
if(writing[i] != -1)
{
close(1);
dup2(writing[i],1);
}
if(reading[i] != -1)
{
close(0);
dup2(reading[i],0);
}
if(execvp(cmd_args[0],cmd_args) == -1)
{
perror("Problem with command");
exit(0);
}
}
else
{
wait(&status);
close(writing[i]);
if(i > 0)
{
close(reading[i]);
}
}
}
else
{
perror("fork");
}
input_file[0] = 0;
output_file[0] = 0;
run_bg = 0;
}
Tôi nghĩ bạn nói đúng. Tôi đã cố gắng bình luận ra nếu (đọc [m]! = -1) đóng (đọc [m]); trong vòng lặp, và đó là cho phép tôi để đường ống 2 lệnh. Cám ơn đã chỉ tôi hướng đi đúng! – mbxtr