Я пишу программу с двумя аргументами - именем команд. Программа должна перенаправить вывод первой в файл 'tmp', чем выполнить его, затем перенаправить стандартный ввод второй команды в 'tmp' и выполнить вторую команду.
#include<unistd.h>
#include<fcntl.h>
#include<wait.h>
#include<stdio.h>
int main(int argc, char** argv){
int fd = open("tmp", O_RDWR |O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR);
int cpid = fork();
if(cpid == 0){
dup2(fd, 1);
execlp(argv[1], "", NULL);
}
wait(NULL);
//If we uncoment this line the program gives correct output
//fd = open("tmp", O_RDWR, S_IRUSR | S_IWUSR);
dup2(fd, 0);
execlp(argv[2], "", NULL);
}
Однако, когда я запускаю программа типа ./main ls wc
вместо 5 5 50
я получаю вывод 0 0 0
, что означает, что команда wc
считывает 0 байтов из stdin. Но если я вместо этого создаю дескриптор файла заново в том же файле tmp, программа выдаст правильный результат. Как можно объяснить такое поведение?