Ничо у меня не получается(. Вот 3-я лаба: использование очереди сообщений - типа клиент сначала собирает у всех потомков их пиды, а потом, када ужо все считал - отправляет назад всем. Работает все, вот только как-то хаотично выводит сообщения - оно что, вообще не синхронизировано?
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sstream>
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/dir.h>
#include <unistd.h>
#include <dirent.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/msg.h>
/*
*
*/
using namespace std;
typedef struct mymsgbuf
{
long mtype;
int num;
int num_mas[20];
} mess_t;
pid_t pid;
int col;
int ctr = 0;
int main_pid;
string s_pid;
ostringstream strStream;
void usrHandler(int sig) {
if (sig==SIGUSR1) ctr++;
}
int main(int argc, char** argv) {
int mas[20];
signal(SIGUSR1,usrHandler);
int qid;
key_t msgkey;
mess_t buf;
int length;
length = sizeof(mess_t) - sizeof(long);
msgkey = ftok(".",'m');
qid = msgget(msgkey, IPC_CREAT | 0660);
main_pid = getpid();
cout<<"Введіть кількість місць у автобусі: ";
cin>>col;
if(col >= 1)
pid = fork();
for(int i = 0; i<col-1; i++)
if(pid) pid = fork();
if(!pid){
buf.mtype = 1;
buf.num = (int)getpid();
cout<<"\nКлієнт відправив повідомлення: "<<buf.num;
msgsnd(qid, &buf, length, 0);
kill(main_pid, SIGUSR1);
if(msgrcv(qid, &buf, length, 2, 0) > 0){
cout<<"\nКлієнт прийняв повідомлення:\n";
for(int i = 0; i<col; i++)
cout<<endl<<buf.num_mas[i];
}
}
if(pid){
sleep(0.5);
int i = 0;
while(ctr<col){sleep(0.001);}
while(i<col){
if(msgrcv(qid, &buf, length,1, 0)>0){
cout<<"\nСервер прийняв повідомлення: "<<buf.num;
mas[i] = buf.num;
i++;
}
}
for(int i = 0; i<col; i++)
buf.num_mas[i] = mas[i];
for(int i = 0; i<col; i++){
buf.mtype = 2;
if(msgsnd(qid, &buf, length, 0) != -1)
cout<<"\nСервер відправив повідомлення...";}
sleep(1);
msgctl(qid, IPC_RMID, 0);
}
return (EXIT_SUCCESS);
}
А вот, что выводит:
Введіть кількість місць у автобусі: 5
Сервер прийняв повідомлення: 6934
Сервер прийняв повідомлення: 6935
Сервер прийняв повідомлення: 6936
Сервер прийняв повідомлення: 6937
Клієнт відправив повідомлення: 6934
Клієнт прийняв повідомлення:
Сервер прийняв повідомлення: 6938
6934
6935
6936
6937
6938Клієнт відправив повідомлення: 6935
Клієнт прийняв повідомлення:
6934
6935
6936
6937
6938Сервер відправив повідомлення...
Клієнт відправив повідомлення: 6936
Клієнт прийняв повідомлення:
6934
6935
6936
6937
6938Сервер відправив повідомлення...
Сервер відправив повідомлення...
Сервер відправив повідомлення...
Клієнт відправив повідомлення: 6937
Клієнт прийняв повідомлення:
6934
6935
6936
6937
6938Клієнт відправив повідомлення: 6938
Клієнт прийняв повідомлення:
6934
6935
6936
6937
6938Сервер відправив повідомлення...[Press Enter to close window]
Что за бред?