Tôi đang cố gắng chạy một chương trình có đầu vào tiêu chuẩn cụ thể. Tôi thành công bằng cách sử dụng một bộ mô tả tập tin của một tập tin, nơi có là những gì tôi muốn đưa vào stdin, nhưng tôi không viết trực tiếp trên stdin:execv * và viết bằng stdin
$cat input.test
echo Hello
$
Mã C:
int main(int argc, char **argv)
{
int fd = 0;
fd = open("input.test", O_CREAT);
close(STDIN_FILENO);
dup2(fd, STDIN_FILENO);
char *const args[] = { "bash", NULL };
execvp("bash", args);
}
Đó hoạt động:
$./a.out
Hello
$
Nhưng nếu tôi cố gắng để viết trực tiếp trên STDIN sử dụng ống hiển thị chương trình gì và giữ chạy:
int main(int argc, char **argv)
{
int fds[2];
pipe(fds);
close(STDIN_FILENO);
dup2(fds[1], STDIN_FILENO);
write(fds[1], "echo Hello;", 11); // Résults are identics with fds[0]
char *const args[] = { "bash", NULL };
execvp("bash", args);
}
Cảm ơn sự giúp đỡ của bạn
Thân ái, Bastien.
EDIT Giải quyết vấn đề:
Cám ơn câu trả lời của bạn, đây mã mà hoạt động:
int main(void)
{
int fd[2];
pid_t pid;
if (pipe(fd) < 0)
return EXIT_FAILURE;
if ((pid = fork()) < 0)
return EXIT_FAILURE;
else if (pid != 0) { /* father */
close(fd[1]);
dup2(fd[0], STDIN_FILENO);
execlp("bash", "bash", (char *)0);
} else { /* son */
close(fd[0]);
write(fd[1], "echo hello\n", 11);
}
return EXIT_SUCCESS;
}
tại sao bạn lại giảm bớt người khác?tìm hiểu tâm trí muốn biết :) – Will
Tôi không biết tại sao tất cả các câu trả lời đều bị bỏ phiếu. – Mat