Вот пример программы, которая создает канал, затем разветвляет процесс и вызывает функцию отправителя в родительском элементе и получателя в дочернем. Дескрипторы создания канала и файла находятся в одном файле исходного кода со связанным файлом заголовка, как отправитель и получатель. Файл main
запрашивает создание канала, затем выполняет fork()
и вызывает функции sender
и receiver
.
pipe.h - содержит объявление extern
для дескрипторов файла канала, а также объявление функции, которая создает канал: -
#ifndef PIPE_H
#define PIPE_H
extern int pipe_fd[2];
void create_pipe(void);
#endif
pipe.c - содержит фактическое определение массива pipe_fd
: -
#include "pipe.h"
#include <unistd.c>
int pipe_fd[2];
void create_pipe(void)
{
pipe(pipe_fd);
}
sender.h - объявляет прототип для функции sender ()
#ifndef SENDER_H
#define SENDER_H
void sender(void);
#endif
sender.c: -
#include "sender.h"
#include "pipe.h"
#include <unistd.h>
#include <stdio.h>
void sender(void)
{
char buf[]="Hello world";
printf("Sender: PID = %d\n", getpid());
close(pipe_fd[0]);
write(pipe_fd[1], buf, sizeof(buf));
}
receiver.h: -
#ifndef RECEIVER_H
#define RECEIVER_H
void receiver(void);
#endif
receive.c - зеркальное отображение отправителя
#include <stdio.h>
#include <unistd.h>
#include "receiver.h"
#include "pipe.h"
void receiver(void)
{
int bytes;
char buf[101];
printf("Receiver: PID = %d\n", getpid());
close(pipe_fd[1]);
bytes = read(pipe_fd[0], buf, 100);
buf[bytes]='\0';
printf("Receiver got: %s\n", buf);
}
main.c - связывает все вместе
#include "pipe.h"
#include "sender.h"
#include "receiver.h"
#include <sys/types.h>
#include <unistd.h>
void launch_sender_receiver(void)
{
pid_t forkpid;
forkpid = fork();
if (forkpid == 0)
receiver(); /* child */
else
sender();
}
int main(int argc, char* argv[])
{
create_pipe();
launch_sender_receiver();
return 0;
}
Надеюсь, вы можете следовать всему этому из кода, но если нет, то здесь есть небольшое дополнительное объяснение.
Функция create_pipe () в pipe.c создает канал и помещает два файловых дескриптора в file_fd
. Файл pipe.h предоставляет объявление extern
для файловых дескрипторов, чтобы к ним могли обращаться файлы отправителя и получателя (лучше бы при программировании обеспечить функции «получателя» для этих файловых дескрипторов в pipe.h так, чтобы sender()
и receiver()
не имеют доступа к глобальным переменным).
Отправитель и Получатель используют массив pipe_fd
для записи или чтения из канала после закрытия дескриптора файла, который им не нужен. Функция main()
связывает все это вместе, вызывая функцию создания канала, а затем выполняет разветвление и вызывая отправителя или получателя в зависимости от того, является ли он родительским или дочерним, соответственно.
Запуск полной программы должен дать вам следующий результат (хотя, конечно, PID, которые вы получите, будут другими): -
Receiver: PID = 3285
Sender: PID = 3284
Receiver got: Hello world
Имеет ли все это смысл?