From 5dbe188b089446496cbb40a98e0ca0d063f95565 Mon Sep 17 00:00:00 2001 From: ElectronixTM Date: Fri, 3 Oct 2025 16:39:43 +0300 Subject: [PATCH] feat[OS/lab6]: completed? MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit В задании просят починить файлы, но фактически они даются нам уже рабочими, поэтому мне нужно только разобраться с тем, что происходит внутри --- OSs/lab6/Makefile | 15 ++++++ OSs/lab6/client_msg.c | 99 +++++++++++++++++++++++++++++++++++ OSs/lab6/server_msg.c | 116 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 230 insertions(+) create mode 100644 OSs/lab6/Makefile create mode 100644 OSs/lab6/client_msg.c create mode 100644 OSs/lab6/server_msg.c diff --git a/OSs/lab6/Makefile b/OSs/lab6/Makefile new file mode 100644 index 0000000..74fa959 --- /dev/null +++ b/OSs/lab6/Makefile @@ -0,0 +1,15 @@ +targets = server_msg client_msg +all: $(targets) + +server_msg: server_msg.o + $(CC) -o $@ $^ $(CFLAGS) + +client_msg: client_msg.o + $(CC) -o $@ $^ $(CFLAGS) + +%.o: %.c + $(CC) -c $^ -o $@ $(CFLAGS) + +clean: + rm -f $(targets) + rm -f *.o diff --git a/OSs/lab6/client_msg.c b/OSs/lab6/client_msg.c new file mode 100644 index 0000000..78be4c7 --- /dev/null +++ b/OSs/lab6/client_msg.c @@ -0,0 +1,99 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#define MQ_KEY1 1234L +#define MQ_KEY2 2345L +#define MAXMESGDATA 4096 + +struct mymesg { + long mesg_len; + long mesg_type; + char mesg_data[MAXMESGDATA]; +}; + +void client(int readid, int writeid); +ssize_t mesg_send(int id, struct mymesg *mptr); +ssize_t mesg_recv(int id, struct mymesg *mptr); + +int main(int argc,char **argv) +{ + int readid, writeid; + + if((writeid=msgget(MQ_KEY1,0666)) < 0) + { + printf("Client: can not get writeid!\n"); + exit(1); + } + printf("Client:writeid=%d\n",writeid); + + if((readid=msgget(MQ_KEY2,0666)) < 0) + { + printf("Client: can not get readid!\n"); + exit(1); + } + printf("Client: readid=%d\n",readid); + + client(readid,writeid); + + if((msgctl(readid,IPC_RMID, NULL)) < 0) + { + printf("Client: can not delete massage queue2!\n"); exit(1); + } + + if((msgctl(writeid,IPC_RMID, NULL)) < 0) + { + printf("Client: can not delete massage queue1!\n"); exit(1); + } + + exit(0); +} + +void client(int readid, int writeid) +{ + size_t len; + ssize_t n; + struct mymesg ourmesg; + + printf("Client:readid=%d writeid=%d\n",readid,writeid); + printf("Input file name, please\n"); + + fgets(ourmesg.mesg_data,MAXMESGDATA, stdin); + len=strlen(ourmesg.mesg_data); + + if(ourmesg.mesg_data[len-1]=='\n') len--; + ourmesg.mesg_len=len; + + ourmesg.mesg_type=1; + + printf("Client: %s\n",ourmesg.mesg_data); + + mesg_send(writeid,&ourmesg); + + printf("Client: tvk before recv!\n"); + + while((n= mesg_recv(readid, &ourmesg))>0) + //n= mesg_recv(readid, &ourmesg); + write(1,ourmesg.mesg_data, n); +} + +ssize_t mesg_send(int id, struct mymesg *mptr) +{ + return(msgsnd(id, &(mptr->mesg_type),mptr->mesg_len, 0)); +} + +ssize_t mesg_recv(int id, struct mymesg *mptr) +{ + ssize_t n; + + n=msgrcv(id, &(mptr->mesg_type),MAXMESGDATA,mptr->mesg_type, 0); + mptr->mesg_len=n; + printf("Client: n=%d\n",n); + + return(n); +} + diff --git a/OSs/lab6/server_msg.c b/OSs/lab6/server_msg.c new file mode 100644 index 0000000..2ddc3b5 --- /dev/null +++ b/OSs/lab6/server_msg.c @@ -0,0 +1,116 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#define MQ_KEY1 1234L +#define MQ_KEY2 2345L +#define MAXMESGDATA 4096 + +struct mymesg { + long mesg_len; + long mesg_type; + char mesg_data[MAXMESGDATA]; +}; + +void server(int readid, int writeid); +ssize_t mesg_send(int id, struct mymesg *mptr); +ssize_t mesg_recv(int id, struct mymesg *mptr); + +int main(int argc,char **argv) +{ + int readid, writeid; + key_t key1,key2; + + printf("Server: Hello tvk!\n"); + + /* + if((key1=ftok("/home/tvk/IPC/input.txt",'A'))<0) + { + printf("Server: can not get key!\n"); exit(1); + } + printf("key1=%x\n",key1); + */ + if((readid=msgget(MQ_KEY1, 0666|IPC_CREAT)) < 0) + { + printf("Server: can not get readid!\n"); exit(1); + } + printf("Server: readid=%d\n",readid); + /* + if((key2=ftok("/home/tvk/IPC/server_msg.c",'B'))<0) + { + printf("Server: can not get key!\n"); exit(1); + } + printf("key2=%x\n",key2); + */ + if((writeid=msgget(MQ_KEY2, 0666|IPC_CREAT)) < 0) + { + printf("Server: can not get readid!\n"); exit(1); + } + printf("Server: writeid=%d\n",writeid); + + server(readid,writeid); + + exit(0); +} + +void server(int readid, int writeid) +{ + FILE *fp; + ssize_t n; + struct mymesg ourmesg; + + printf("Server:readid=%d writeid=%d\n",readid,writeid); + + ourmesg.mesg_type=1; + + if( (n=mesg_recv(readid, &ourmesg)) == 0) + { + printf("Server: can not read file name\n"); + exit(1); + } + ourmesg.mesg_data[n]='\0'; + + printf("Server: file name %s\n",ourmesg.mesg_data); + + if( (fp=fopen(ourmesg.mesg_data,"r"))==NULL) + { + printf("Server: can not open file name\n"); + + } + else + { + printf("Server: %s is opened\n",ourmesg.mesg_data); + + while(fgets(ourmesg.mesg_data, MAXMESGDATA,fp) != NULL) + { + ourmesg.mesg_len=strlen(ourmesg.mesg_data); + printf("Server: %s\n",ourmesg.mesg_data); + mesg_send(writeid,&ourmesg); + } + } + fclose(fp); + ourmesg.mesg_len=0; + mesg_send(writeid,&ourmesg); +} + +ssize_t mesg_send(int id, struct mymesg *mptr) +{ + return(msgsnd(id, &(mptr->mesg_type),mptr->mesg_len, 0)); +} + +ssize_t mesg_recv(int id, struct mymesg *mptr) +{ + ssize_t n; + n=msgrcv(id, &(mptr->mesg_type),MAXMESGDATA,mptr->mesg_type, 0); + mptr->mesg_len=n; + + return(n); +} + + + +