Я должен написать две отдельные программы, одна из которых является производителем, а вторая - потребителем (обе работают в отдельных терминалах). Я предоставляю аргумент для продюсера, который может быть текстом или одним символом. Затем производитель создает файл .txt
, помещает в него один символ и закрывает его. Потребитель открывает этот файл, читает этот символ и печатает его на терминале, затем закрывает файл и удаляет его. Весь процесс повторяется. Если указанный аргумент включает *
, например *
или text*
, он завершает обе программы, печатая *
перед завершением. Я могу использовать только функции: open()
, close()
, read()
, write()
, unlink()
. Ожидаемый результат выглядит следующим образом:
Я написал оба кода, это код производителя:
(я в курсе из-за того, что я излишне определил SIZE
и использовал его, пожалуйста, не возражайте против этого)
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#define SIZE 1
int main(int argc, char *argv[]){
char buff;
do{
int fdi=-1;
while(fdi<0){
fdi=open("test.txt",O_WRONLY | O_CREAT | O_EXCL, 0666);
}
read(STDIN_FILENO,&buff,SIZE);
write(fdi,&buff,SIZE);
close(fdi);
}while(buff!='*');
return 0;
}
и это код потребителя:
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#define SIZE 1
int main(int argc, char *argv[]){
char buff;
do{
int fdi=-1;
while(fdi<0){
fdi=open("test.txt",O_RDONLY | O_EXCL);
}
int rdin=read(fdi,&buff,SIZE);
if(rdin>0){
write(STDOUT_FILENO,&buff,SIZE);
close(fdi);
unlink("test.txt");
}
else{
close(fdi);
}
}while(buff!='*');
return 0;
}
Мой вопрос : как программа Producer не вставляет в файл более одного символа? Я имею в виду, что если я, например, только запускаю программу Producer и предоставляю аргумент text
, он вставит в файл только букву t
, а остальные будут вставлены в другие файлы. Разве это не l oop и добавление всего слова text
в один файл? Нет заявления, гарантирующего, что файл будет содержать один символ, однако он содержит только один символ, и я не знаю почему.