Соедините и отправьте две оболочки вместе

#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