Я работаю над программой, которая просит пользователя ввести s, f или 0 в качестве пользовательского ввода. S печатает предопределенное сообщение в систему, а f записывает это предопределенное сообщение в файл, заданный пользователем в качестве аргумента. 0 завершает программу.
Мне нужно, чтобы у программы был только один оператор write, который записывает в stdout. Я должен скопировать предопределенное сообщение, напечатанное в stdout, в файл с dup2.
Теперь эти два процесса должны быть разделены вводом (f записывает в файл, а s записывает в stdout), поэтому я не уверен, как реализовать это в выражении switch.
Когда вы вводите f, он ничего не должен печатать на стандартный вывод.
Вот мой код:
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <sys/wait.h>
#define BUFFER_SIZE 128
#define PERMS 0666
int main(int argc, char *argv[])
{
char outBuffer[BUFFER_SIZE] = "This is a message\n";
int count;
int fd;
char input =0;
int a;
int c;
int k[2];
pipe(k);
if(argc!=2){
printf("Provide an valid file as an argument\n");
exit(1);
}
if((fd = open(argv[1],O_CREAT|O_WRONLY|O_APPEND,PERMS)) == -1)
{
printf("Could not open file\n");
exit(1);
}
printf("0 to terminate, s to write to stdout, f to write to file\n");
do{
scanf(" %c", &input);
switch(input)
{
case 'f':
if((c = fork()) == 0)
{
close(k[0]);
dup2(fd,1);
close(k[1]);
}
else
{
close(k[0]);
close(k[1]);
wait(0);
wait(0);
}
break;
case 's':
write(1,outBuffer,strlen(outBuffer));
break;
default:
printf("Invalid Choice\n");
}
}while(input != '0');
close(fd);
return 0;
}
f прямо сейчас просто направляет стандартный вывод в файл после нажатия s (печатает сообщение outBufer) или после запуска переключателя по умолчанию
мой желаемый вывод:
f
f
s
This is a message
s
This is a message
f
файл содержит:
This is a message
This is a message
This is a message