Размер указателей может варьироваться между данными и указателями функции?

Ваши основные проблемы, в этом случае (т.е. когда" кодирование демона Linux и удивление, которое лучше подходит использовать для осуществления взаимного исключения "), должны быть:

  1. заблокированный файл будет локален, или это может быть на NFS?
    • , например, пользователь может обмануть Вас в создание и блокировку изодромного с предварением файла Вашего демона на NFS?
  2. , как блокировка будет вести себя, когда fork луг, или когда процесс демона будет завершен с экстремальным предубеждением, например, kill -9?

flock и fcntl команды ведут себя по-другому в обоих случаях.

Моя рекомендация состояла бы в том, чтобы использовать fcntl. Можно обратиться к статья Захвата файла о Википедии для всестороннего обсуждения проблем, связанных с обоими решениями:

у И скопления и fcntl есть причуды, которые иногда озадачивают программистов от других операционных систем. Является ли работа блокировок скопления над сетевыми файловыми системами, такими как NFS, зависящей от реализации. В системах BSD вызовы скопления успешны без операций в секунду. На Linux до 2.6.12 запросов скопления к файлам NFS только действовал бы локально. Ядро 2.6.12 и выше реализации скапливается запросы к файлам NFS с помощью блокировок диапазона байта POSIX. Эти блокировки будут видимы другим клиентам NFS, которые реализуют fcntl () / блокировки POSIX. 1 обновления Блокировки и снижения выпускают старую блокировку прежде, чем применить новую блокировку. Если приложение понизит монопольную блокировку до коллективной блокировки, в то время как другое приложение заблокировано, ожидая монопольной блокировки, последнее приложение получит монопольную блокировку, и первое приложение будет заблокировано. Все блокировки fcntl, связанные с файлом для данного процесса, удалены, когда любой дескриптор файла для того файла закрывается тем процессом, даже если блокировку никогда не требовали на тот дескриптор файла. Кроме того, fcntl блокировки не наследованы дочерним процессом. Близкая семантика fcntl особенно неприятна для приложений, которые называют библиотеки подпрограмм, которые могут получить доступ к файлам.

21
задан Ciro Santilli 新疆改造中心法轮功六四事件 26 June 2015 в 20:31
поделиться

6 ответов

> type ppp.c
#include <stdio.h>
#include <stdlib.h>

int global = 0;

int main(void) {
    int local = 0;
    static int staticint = 0;
    int *mall;
    int (*fx)(void);

    fx = main;
    mall = malloc(42); /* assume it worked */
    printf("#sizeof pointer to local: %d\n", (int)sizeof &local);
    printf("#sizeof pointer to static: %d\n", (int)sizeof &staticint);
    printf("#sizeof pointer to malloc'd: %d\n", (int)sizeof mall);
    printf("#sizeof pointer to global: %d\n", (int)sizeof &global);
    printf("#sizeof pointer to main(): %d\n", (int)sizeof fx);
    free(mall);
    return 0;
}
> tcc -mc ppp.c
Turbo C  Version 2.01 ...
warnings about unused variables elided ...
Turbo Link  Version 2.0 ...
> ppp
#sizeof pointer to local: 4
#sizeof pointer to static: 4
#sizeof pointer to malloc'd: 4
#sizeof pointer to global: 4
#sizeof pointer to main(): 2
> tcc -mm ppp.c
> ppp
#sizeof pointer to local: 2
#sizeof pointer to static: 2
#sizeof pointer to malloc'd: 2
#sizeof pointer to global: 2
#sizeof pointer to main(): 4

tcc -mc generates code in the "compact" model; tcc -mm generates code in the "medium" model

10
ответ дан 29 November 2019 в 21:06
поделиться

On real-mode x86, code & data is accessed by segment + offset, each a 16-bit quantity. "Near" pointers were 16-bit only and used the current segment, "Far" pointers were 32-bit and specified the segment and offset. For C compilers, there were several different memory models you could choose, with different defaults of near or far pointers for code and data.

For example, the "Medium" memory model used near pointers for data but far pointers for code by default.

I wouldn't be surprised if some modern embedded processors have similar memory models.

8
ответ дан 29 November 2019 в 21:06
поделиться

Обратите внимание, что POSIX требует, чтобы указатели на объекты и указатели на функции были одного размера:

2.12.3 Типы указателей

Все типы указателей функций должны иметь то же представление, что и тип указатель на void. Преобразование указателя функции в void * не должно изменять представление. Значение void *, полученное в результате такого преобразования, может быть преобразовано обратно в исходный тип указателя функции с использованием явного преобразования без потери информации.

Примечание: Стандарт ISO C не требует этого, но он необходим для соответствия POSIX.

Следовательно, системы, которые заявляют о соответствии POSIX, будут единообразными. Если вы нацелены только на такие машины, вам не нужно беспокоиться о различиях.

6
ответ дан 29 November 2019 в 21:06
поделиться

Машины, использующие Гарвардскую архитектуру , имеют отдельное хранилище для инструкций и данных и, соответственно, имеют отдельные адресные пространства для инструкций и данных. В такой архитектуре нет реальной причины иметь два адресных пространства (или поддерживающую их физическую память) одинакового размера.

4
ответ дан 29 November 2019 в 21:06
поделиться

Это "зависит". В C ++ я напоминаю, что указатели на функции-члены на самом деле представляют собой два указателя по размеру, но это может быть чисто детализация реализации.

В некоторых действительно старых системах, предшествовавших ПК, размер указателя мог также зависеть от того, на что ссылались ( но тогда вы также можете иметь 11-битные символы: D)

1
ответ дан 29 November 2019 в 21:06
поделиться

16-разрядные микроконтроллеры PIC (Microchip PIC24 и dsPIC) являются примерами устройств с гарвардской архитектурой с разными размерами указателя данных и кодового пространства. Отдельные адресные пространства различаются по размеру - SRAM на кристалле имеет большую стоимость площади кристалла, чем флэш-память, ее гораздо меньше, поэтому указатели данных могут быть меньше.

Это также верно для PIC12, PIC16 и PIC18. архитектуры тоже, но dsPIC - это то, что я использую в настоящее время.

5
ответ дан 29 November 2019 в 21:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: