return EXIT_FAILURE;
}
}
return EXIT_SUCCESS;}
Посмотрим результаты работы:
После запуска программы на командной строке увидим:
FATHER STARTED!
THIS MESSAGE POSTED SON
FATHER RECEIVED MESSAGE: "Hello!!! This message from child!"
This is reply from father: "Hello, Son. I received your message!"
Видим, что сначала запускается процесс-отец, затем процесс –сын, который отправляет сообщение. Процесс-отец принимает сообщение и выводит его на экран и посылает ответ процессу-сыну. Процесс-сын выводит сообщение на экран.
Теперь сделаем, чтобы процесс-отец был клиентом и отправлял сообщение, а процесс-сын был сервером.
Ниже представлен текст программы:
// пытаемся сделать процесс сын сервером
#include <stdlib.h>
#include <stdio.h>
#include <process.h>
#include <errno.h>
#include <sys/neutrino.h>
int main(int argc, char *argv[]) {
int chid; // ID КАНАЛА
int rcvid; // КОМУ ОТВЕЧАТЬ
/* ПРОЦЕСС-РЕБЁНОК ПРИНИМАЕТ СООБЩЕНИЕ И ОТПРАВЛЯЕТ ОТВЕТ*/
if (fork()==0){
// БУФЕРЫ ДЛЯ ОТПРАВЛЯЕМОГО СООБЩЕНИЯ И ОТВЕТА
char receivebuf[64];
char replybuf[64];
printf("SON STARTED!\n");
chid=ChannelCreate(0);
rcvid = MsgReceive(chid,receivebuf,sizeof(receivebuf),NULL);
if (rcvid > 0){
printf("SON RECEIVED MESSAGE: \"%s\"\n",&receivebuf);
strcpy(replybuf,"Hello,Father. I received your message!\n");
MsgReply(rcvid,EOK,replybuf,sizeof(replybuf));
else{
printf("ERROR: MsgReceive failed\n");
return EXIT_FAILURE;
}
}
else{
// ПРОЦЕСС-ОТЕЦ ОТПРАВЛЯЕТ СООБЩЕНИЕ
// БУФЕРЫ
char sendbuf[64];
char replybuf[64];
// ИДЕНТИФИКАТОР СОЕДИНЕНИЯ
int coid;
// ОТКРЫВАЕМ КАНАЛ
coid=ConnectAttach( 0, getppid(), chid, 0, 0 );
if (coid > 0){
// тЕКСТ СООБЩЕНИЯ
strcpy(sendbuf," Hello!!! This message from father!\n");
MsgSend(coid, sendbuf, sizeof(sendbuf),replybuf,sizeof(replybuf) );
printf("This is reply from father: \"%s\"\n",&replybuf);
}
else {
printf("ERROR: ConnectAttach failed\n");
return EXIT_FAILURE;
}
}
return EXIT_SUCCESS;
Запустим программу и посмотрим результат:
Видим, что получили ошибку. Это связано с тем, что сервер должен всегда запускаться первым и создавать канал для обмена сообщениями.
2.1.2. Локальные независимые процессы.
Для такой передачи нам необходимо создать 2 процесса: клиент и сервер. Клиент будет отправлять сообщение серверу, а сервер будет принимать сообщение и посылать ответ.
Здесь для передачи сообщения будем использовать неименованный канал.
Функция для создания неименованного канала – ConnectAttach(), которой передаются 3 идентификатора: дескриптор узла, идентификатор процесса и идентификатор канала. Вместе эти три идентификатора однозначно идентифицируют сервер, с которым клиент желает соединиться. Присвоением идентификатору узла нулевого значения мы сообщаем ядру, что желаем установить соединение на локальном узле.
В программе-сервере будем определять идентификатор и записывать его в файл. Программа-клиент будет считывать идентификатор процесса-сервера из файла.
Текст клиента
#include <stdio.h>
#include <sys/neutrino.h>
#include<errno.h>
#include<stdlib.h>
int main(void) {
FILE* pFile;
int pid;
pFile=fopen ("out.txt","r");
fscanf(pFile,"%d",&pid);
printf("pid_server: %d\n",pid);
fclose(pFile);
char *smsg = "HELLO, WORLD!!!";
char rmsg[200];
int coid;
coid=ConnectAttach(0,pid,1,0,0);
if (coid==-1) {
fprintf(stderr,"ERROR CONNECT ATACH!\n");
perror(NULL);
exit(EXIT_FAILURE);
}
if (MsgSend (coid,smsg,sizeof(smsg) +1,rmsg,sizeof(rmsg))==-1){
fprintf(stderr,"ERROR MSGSEND!");
perror(NULL);
exit(EXIT_FAILURE);}
if(strlen(rmsg)>0){
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.