#c
#c
Вопрос:
После просмотра следующего руководства (https://www.geeksforgeeks.org/c-program-demonstrate-fork-and-pipe /), Я понимаю, что не могу заставить два терминала взаимодействовать друг с другом, и я не могу найти ни одного ресурса в Интернете, который говорил бы об этом. Чтобы быть более точным, я пытаюсь заставить два терминала взаимодействовать с одним и тем же кодом, но не с одинаковыми аргументами. Вот две функции, которые я использую:
int connect_parent(void)
{
write(1, "my_pid: ", 9);
my_putnbr(getpid());
write(1, "nwaiting for enemy connection...n", 34);
pause();
signal(SIGINT, handle_sigint);
}
int connect_child(char * char_pid)
{
int parent_pid = my_getnbr(char_pid);
int my_pid = getpid();
int fd[2];
if (pipe(fd) == -1) {
write(2, "Pipe failedn", 13);
return 84;
}
close(fd[0]);
write(fd[1], "test", 5);
close(fd[1]);
if (kill(parent_pid, SIGINT) != -1) {
write(1, "my_pid: ", 9);
my_putnbr(my_pid);
write(1, "nsuccessfully connectedn", 25);
pause();
return 0;
}
write(2, "Wrong pidn", 11);
return 84;
}
Вот моя основная функция:
int main(int argc, char ** argv)
{
if (argc == 2) {
if (my_strstr(argv[1], "-h") != 0)
help_flag();
if (error_handling(argv[1]) != 84) {
connect_parent();
return 0;
} else
return 84;
} else if (argc == 3) {
if (error_handling(argv[2]) != 84) {
connect_child(argv[1]);
return 0;
} else
return 84;
}
return 84;
}
Родительская функция для первого терминала и дочерняя функция для второго.
Цель состоит в том, чтобы отправить простой текст, когда оба терминала соединены вместе.
На данный момент мой первый терминал ожидает сигнала с pause()
помощью функции, а когда второй отправляет сигнал SIGINT, первый завершает работу.
Вот команда, которую я запускаю на своем первом терминале:
./navy ./pos1
И вот команда, которую я выполняю для второй:
./navy <pid of the first terminal> ./pos2
Есть ли у вас ресурс, на который я могу положиться, или объяснение того, как это сделать?
Комментарии:
1. Что такое
./navy
?2. @Barmar ./navy — это имя моего исполняемого файла
3. Да, так что покажите код для
navy
. Как этоmain
выглядит? Какой еще код отсутствует?4. Вы не показали
main()
функцию, что она делает с аргументами? Как это соединяет два процесса вместе?5. Затем вам просто нужно сохранить текст в переменной общей памяти
Ответ №1:
Обе программы должны будут выполнить эти строки:
key_t key = ftok(<existing_file>, <random_number>); //for example: ftok("navy.c", 12);
char **text;
int memid = shmget(key, sizeof(char *), IPC_CREAT | IPC_EXCL | 0600); //if this returns -1, an error occured
*text = shmat(memid, 0, 0); //You attach the pointer to the shared memory variable position
Затем вы можете изменять text
их по своему усмотрению. Обе программы будут «видеть» эту переменную.
Не забудьте shmdt(*text)
(отсоединить указатель) в обоих исполнениях и очистить пространство памяти, которое вы создали для выполнения вашей общей переменной: shmctl(memid, IPC_RMID, NULL);
только в одном из процессов после того, как вам больше не нужна общая переменная.
Комментарии:
1.
ftok()
будет возвращен адрес свободной памяти в вашей системе и сохранен вkey_t
переменной2. Я думаю, вы забыли C в IPC_EXCL