Как определить, используют ли другие процессы дескриптор файла?

Я пишу приложение на C++ для среды Linux, которое будет работать в многопроцессорной настройке (т.е. программа вызывает fork()). В рамках приложения я создаю некоторые файловые дескрипторы (в данном случае сокеты), мне интересно, может ли программа определить, сколько других процессов имеют этот файловый дескриптор. В этом случае я хочу выполнить специальные действия перед закрытием последней копии файлового дескриптора.

Я знаю, что реализация close для файловых дескрипторов, таких как сокеты TCP, кажется, выполняет это, но я не уверен, как это сделать.

Изменить: я ищу способ сделать это без доступа к основному коду или коду ответвления. Код находится в библиотеке, предоставляющей эти сокеты другим приложениям.

Пример кода:

void handle_socket(int socket_fd) {
    // determine number of processes with this socket_fd open.
    if (num_proc == 1) {
        // Special code
    }
    close(socket_fd);
}

int main(int argc, char *argv[]) {
    int socket_fd = socket(...);
    if (fork() == 0) {
        //action 1
    } else {
       // action 2
    }
    handle_socket(socket_fd);
    return 0;
}

person Stephen L    schedule 10.07.2011    source источник
comment
как насчет использования семафоров и/или общей памяти для отслеживания количества открытых файловых дескрипторов?   -  person Kiran Mohan    schedule 10.07.2011
comment
Может сработать, но будет полагаться на возможность добавления кода к любому вызову форка для выполнения кода подсчета. В моем примере показано, что у вас есть доступ к коду, но это не всегда так.   -  person Stephen L    schedule 10.07.2011


Ответы (1)


Если вы пишете функцию main(), которая порождает дочерние процессы, вам следует дождаться завершения этих дочерних процессов.

person David Hammen    schedule 10.07.2011