Основная функция среды процесса, процесс завершается, аргументы командной строки и таблица среды

mainфункция

Из C программы всегда mainначинается выполнение функций. mainПрототип функции является:

int main(int argc, char *argv[]);

argcЯвляется ли количество аргументов командной строки, argvпредставляет собой массив указателей каждый из которых указывает параметры составлявших.

Когда программа выполнения ядра C, вызов , mainпрежде чем функция вызвать специальную процедуру запуска. Этот исполняемый файл , указанный в качестве адреса процедуры обычного запуска - это настройки редактора соединения, связанные с помощью редактора редактора C называется. Процедура запуска , чтобы получить аргументы командной строки и среды значения переменных из ядра, то , как описано выше , чтобы позвонить mainфункцию , чтобы принять меры.

Процесс завершается

Есть 8 способов сделать процесс прекращения, в том числе пяти видов нормального завершения, то они таковы:

  • С mainвозвращением
  • вызовexit
  • Позвоните _exitили_Exit
  • Последний поток возвращается из своей процедуры запуска
  • Последний вызов из потокаpthread_exit

Отменен три способа, то они таковы:

  • Вызов abortфункции
  • Прием сигнала
  • Последняя нить, чтобы ответить на запрос отмены

1. Закройте функцию

3 функции для нормального завершения. _exitИ _Exitфункции сразу в ядре exitфункцию для выполнения какого - то процесса очистки, а затем вернуться к ядру.

#include <stdlib.h>
void exit(int status);
void _Exit(int status);
#include <unistd.h>
void _exit(int status);

mainВызов функции возвращает целое число со значением exitэквивалента. Таким образом , в mainфункции , exit(0);эквивалентнойreturn (0);

Пример испытаний:

#include <stdio.h>
main()
{
    printf("hello, world\n");
}

2. Функцииatexit

В соответствии с ISO C, процесс может быть зарегистрировано до 32 функций, эти функции будут exitавтоматически вызывает. Эти функции называются завершение программы обработки, и вызывает atexitфункцию , чтобы зарегистрировать эти функции.

#include <stdlib.h>
int atexit(void (*func)(void));
返回值:若成功,返回 0;若出错,返回非 0

atexitПараметр функции является адресом функции, при вызове этой функции без необходимости передавать параметры к нему, не ожидает , что он возвращает значение. exitПорядок функции и вызывать эти функции , когда они проверяются в обратном порядке. Если же функция регистрируется несколько раз, он будет вызываться несколько раз.
Пример испытаний:

#include "../../include/apue.h"

static void my_exit1(void);
static void my_exit2(void);

int main(void)
{
    if(atexit(my_exit2) != 0)
        err_sys("can't register my_exit2");

    if(atexit(my_exit1) != 0)
        err_sys("can't register my_exit1");
    if(atexit(my_exit1) != 0)
        err_sys("can't register my_exit1");

    printf("main is done\n");
    return 0;
}

static void my_exit1(void)
{
    printf("first exit handler\n");
}

static void my_exit2(void)
{
    printf("second exit handler\n");
}

Результаты таковы:

Из приведенного выше графика, прекращение функции порядок выполнения противоположен порядку их регистрации, а также my_exit1функция регистрируется дважды, она выполняется в два раза.

Параметры командной строки

При выполнении программы, вызывая execаргументы командной строки процесс может быть передан в новую программу. Это часть нормальной работы UNIX оболочки.
Тестовый пример:
Все аргументы командной строки вторили на стандартный вывод, однако, обычная echoпрограмма не может повторить аргумент номер 0.

#include "../../include/apue.h"

int main(int argc, char *argv[])
{
    int i;
    //for(i = 0; i < argc; i++)
    for(i = 0; argv[i] != NULL; i++)    
        printf("argv[%d]: %s\n", i, argv[i]);
    return 0;
}

Результаты таковы:

Экологическая Таблица

Каждая программа получает таблицу окружения, ту же таблицу с параметрами таблица среды символьный массив указателей, каждый из которых содержит указатель на нуль ( «\ 0») адрес конца строки C. Глобальная переменная environсодержит адрес массива указателей:

extern char **environ;

Мы называем environдля указателя окружения, массив указателей на окружающую среду таблицу, где каждая строка представляет собой указатель на строки окружения. Исторически сложилось, что большинство систем UNIX поддерживают основная функция принимает три параметра, третий параметр является адресом таблицы среда:

int main(int argc, char *argv[], char *envp[]);

Поскольку положения ISO C mainфункции только два параметра, а первые три параметра и глобальные переменные по environсравнению с не принести больше пользы, она также обеспечивает POSIX.1 следует использовать environвместо первых трех параметров. Обычно используются getenvи putenvфункции переменных среды доступа, а не environпеременных. Тем не менее, если вы хотите , чтобы увидеть всю окружающую среду, необходимо использовать environуказатель.

发布了229 篇原创文章 · 获赞 17 · 访问量 1万+

рекомендация

отblog.csdn.net/qq_40073459/article/details/104419018