int main (void) {
int rc=fork();
if(rc==0){
close(1); //close stdout BEFORE opening my file
open("./c.txt", O_CREAT|O_WRONLY|O_TRUNC, S_IRWXU);
//execve "wc"
char *cmd[3];
cmd[0] = strdup("wc"); //file to execuable
cmd[1]=strdup("c.c"); //first arg to command 'wc' -> c.c
cmd[2]=NULL;
execvp(cmd[0], cmd);
}
Если я закрою стандартный вывод (), то вывод execve ("w c") будет в файле c.txt
, но ТОЛЬКО если я закрою стандартный вывод ДО открытия () ing. Если я назову это ПОСЛЕ
open("./c.txt", O_CREAT|O_WRONLY|O_TRUNC, S_IRWXU);
close(1);
, то -> wc: write error: Bad file descriptor
.
Я прочитал, что для open () (вероятно, в моем случае для вывода wc
) достигается ОС дескриптор файла от 0, и поэтому сначала он находит 1
как стандартный вывод для printf () на экран. Поэтому мне нужно закрыть его, чтобы использовать дескриптор файла из open ("./c .txt") для wc
. Но если это правильно (я не знаю, где я правильно понял), тогда не имеет значения, закрываю ли я stdout до или после вызова open (), не так ли? После закрытия ОС не имеет другого FD для использования в качестве вывода. Возможно, я не совсем понимаю.
вопрос: почему сначала нужно закрыть fd1, чтобы сделать перенаправление на c .txt?