Системный вызов sigaction - PullRequest
       1

Системный вызов sigaction

1 голос
/ 27 января 2012

Я просматривал справочную страницу sigaction и в итоге посмотрел следующую строку.

sigaction(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE

Что означают _POSIX_X_SOURCE, _X_OPEN_SOURCE, _POSIX_SOURCE? Что с этим делать?

Ответы [ 4 ]

3 голосов
/ 27 января 2012

Это макросы тестирования функций .Их цель состоит в том, чтобы позволить вашей программе сообщать системным заголовочным файлам, каким стандартам вы хотите, чтобы она пыталась соответствовать, и каким расширениям вы хотели бы воспользоваться.

Без определения каких-либо макросов тестирования возможностей реализации могут сильно различаться в зависимости от того, какиемакросы, функции и определения типов, которые они делают видимыми в своих заголовках.Обычная практика - сделать все видимым по умолчанию, что является проблемой, потому что «все» не очень специфично, и очень возможно, что имена символов, используемые в вашей программе, могут конфликтовать с некоторыми из расширений.Даже если они не конфликтуют сейчас, нет способа узнать, будут ли они в будущем.Таким образом, стандарты (такие как ISO C и POSIX) предъявляют строгие требования к реализации, чтобы они не загрязняли пространство имен приложений именами, явно не определенными или зарезервированными в стандартах.Когда вы используете макрос функционального теста для запроса определенного стандарта, вы просите реализацию убедиться, что (1) он обеспечивает все, что определено в этом стандарте, (2) он не загрязняет пространство имен вашего приложения, предоставляя что-то, не определенное вэтот стандарт.

Правильная программа всегда должна явно использовать правильные макросы тестирования возможностей для стандарта (ов), в который она написана.Самый простой способ сделать это - поместить правильный аргумент -D в командную строку компилятора (CFLAGS).Добавление #define в качестве первой строки в каждом исходном файле также работает.Будьте внимательны, если вы делаете это в исходных файлах:

  1. Макросы тестирования функций должны быть определены вверху , прежде чем какой-либо системный заголовок будет включен .
  2. Этообычно плохая идея использовать разные макросы тестирования функций в разных единицах перевода.

Кроме того, это не совсем то же самое, что и другие макросы тестирования функций, но все современные программы должны определять _FILE_OFFSET_BITS=64, когдапостроен на Linux / glibc, чтобы запросить, чтобы off_t был 64-битным для поддержки больших файлов.

1 голос
/ 27 января 2012

Это то, что вам нужно #define, чтобы получить прототип, и они известны как макросы функциональных тестов .

Например, следующий код определенно определит прототипдля sigaction:

#define _XOPEN_SOURCE
#include <signal.h>

Включая signal.h без , что #define (или другие) не будет определять прототип.

1 голос
/ 27 января 2012

Это макрос тестирования функции.

Символы, называемые "макросами теста функции", используются для управления видимостью символов, которые могут быть включеныв шапке.Реализации, будущие версии IEEE Std 1003.1-2001 и другие стандарты могут определять макросы тестирования дополнительных функций.

1 голос
/ 27 января 2012

Вот человек для макрокоманд Feature: http://www.kernel.org/doc/man-pages/online/pages/man7/feature_test_macros.7.html

Они включат или отключат некоторый уровень стандартной поддержки в заголовках.

Например, _POSIX_C_SOURCE> = 1 означает, что POSIX.2-1992 или позже должны быть поддержаны;_X_OPEN_SOURCE означает, что POSIX.1, POSIX.2 и XPG4 включены;и для больших значений макроса (> = 500;> = 600;> = 700) он также включит некоторые варианты SUSv2 v3 или v4 (UNIX 98; 03 или POSIX.1-2008 + XSI).И _POSIX_SOURCE - это устаревший способ определения _POSIX_C_SOURCE = 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...