Чтобы совместно использовать переменную между двумя процессами, созданными с помощью системного вызова fork()
в C, вы можете использовать различные методы. Я объясню несколько часто используемых подходов на примерах кода:
- Общая память:
Общая память позволяет процессам получать доступ к одной и той же области памяти. Вы можете создать сегмент общей памяти с помощью функцииshmget()
и присоединить его к процессам с помощьюshmat()
. Вот пример:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main() {
int shmid;
int *shared_variable;
pid_t pid;
shmid = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT | 0666);
if (shmid == -1) {
perror("shmget");
exit(1);
}
shared_variable = shmat(shmid, NULL, 0);
if (shared_variable == (int *)-1) {
perror("shmat");
exit(1);
}
pid = fork();
if (pid == 0) {
// Child process
*shared_variable = 42;
printf("Child process: shared_variable = %d\n", *shared_variable);
exit(0);
} else if (pid > 0) {
// Parent process
wait(NULL);
printf("Parent process: shared_variable = %d\n", *shared_variable);
} else {
// Fork failed
perror("fork");
exit(1);
}
shmdt(shared_variable);
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
- Каналы.
Каналы обеспечивают однонаправленный канал связи между процессами. Вы можете создать канал с помощью функцииpipe()
и передать конец канала записи одному процессу, а конец чтения другому процессу. Вот пример:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
int pipefd[2];
int shared_variable;
pid_t pid;
if (pipe(pipefd) == -1) {
perror("pipe");
exit(1);
}
pid = fork();
if (pid == 0) {
// Child process
close(pipefd[0]); // Close the read end of the pipe in the child process
shared_variable = 42;
write(pipefd[1], &shared_variable, sizeof(int));
close(pipefd[1]);
exit(0);
} else if (pid > 0) {
// Parent process
close(pipefd[1]); // Close the write end of the pipe in the parent process
read(pipefd[0], &shared_variable, sizeof(int));
close(pipefd[0]);
printf("Parent process: shared_variable = %d\n", shared_variable);
} else {
// Fork failed
perror("fork");
exit(1);
}
return 0;
}
- Очереди сообщений.
Очереди сообщений позволяют обмениваться сообщениями между процессами. Вы можете создать очередь сообщений с помощью функцииmsgget()
и отправлять/получать сообщения с помощьюmsgsnd()
иmsgrcv()
. Вот пример:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
struct message {
long mtype;
int shared_variable;
};
int main() {
int msqid;
struct message msg;
pid_t pid;
msqid = msgget(IPC_PRIVATE, IPC_CREAT | 0666);
if (msqid == -1) {
perror("msgget");
exit(1);
}
pid = fork();
if (pid == 0) {
// Child process
msg.mtype = 1;
msg.shared_variable = 42;
msgsnd(msqid, &msg, sizeof(int), 0);
exit(0);
} else if (pid > 0) {
// Parent process
wait(NULL);
msgrcv(msqid, &msg, sizeof(int), 1, 0);
printf("Parent process: shared_variable = %d\n", msg.shared_variable);
} else {
// Fork failed
perror("fork");
exit(1);
}
msgctl(msqid, IPC_RMID, NULL);
return 0;
}
Это всего лишь несколько примеров того, как можно совместно использовать переменные между процессами, созданными с помощью fork()
. Другие методы включают использование сокетов, файлов или даже использование механизмов межпроцессного взаимодействия более высокого уровня, таких как каналы и сокеты, предоставляемые конкретными библиотеками.