Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > exit, close вопросы на понимание


Автор: DissDoc 6.6.2007, 09:01
Доброе время суток всем. После начала разбора системных вызовов появились еще некоторые вопросы. Собственно код мне не нужен, если нетрудно - объясните пожалуйста логику вызова функций.
1. В случае работы с dub
Код

int fdescr, fdescr2 = 0;
fdescr = open("ttt.txt", O_RDWR|O_TRUNC);
printf("descriptor #1 is %d\n", fdescr);
write(fdescr, "Test", 4);
fdescr2 = dup(fdescr);
printf("descriptor #2 is %d\n", fdescr2);
write(fdescr2, " by ", 4);
close(0);

Почему здесь close(0). Т.е. почему именно 0,а  не что-то другое? (да что может быть там другое?)

2. С работой fork()
a)
Код

if (fork() != 0) exit(0);

b) 
Код

if (fork() == 0) exit(0);

Вот в этих случаях почему 0 в exit? Я пробовал - вижу что происходит! Но exit и close никак не пойму (((

Автор: MAKCim 6.6.2007, 09:16
Цитата(DissDoc @  6.6.2007,  09:01 Найти цитируемый пост)
Почему здесь close(0). Т.е. почему именно 0,а  не что-то другое? (да что может быть там другое?)

нужно
Код

close(fdescr);
close(fdescr2);

вообще вопрос странный: почему нужно что-то одно, а другое не нужно
что требуется в программе, то и нужно делать
Цитата(DissDoc @  6.6.2007,  09:01 Найти цитируемый пост)
Вот в этих случаях почему 0 в exit? Я пробовал - вижу что происходит! Но exit и close никак не пойму ((( 

а почему не должен быть 0?
если fork() завершается с ошибкой тогда
Код

if (fork() < 0) _exit(errno);

Автор: DissDoc 6.6.2007, 09:21
 smile Не вопрос не в том. Можно проще.
Что значит exit(0); close(0);
И еще я где-то еще видел exit(4, 2); Вопрос тот же - что значит?

Автор: HappyCoder 6.6.2007, 09:22
Сам не понимаю, почему close(0). close закрывает дескриптор файла - значит, надо передавать этой функции дескрипторы. Проверь через perror("close");

exit(0) - завершение процесса произошло по нормальной причине
exit(1) или exit(-1) - процесс завершился с ошибкой

По поводу exit подробней написано в
Код

man 3 exit

Автор: MAKCim 6.6.2007, 09:28
Цитата(HappyCoder @  6.6.2007,  09:22 Найти цитируемый пост)
exit(1) или exit(-1) - процесс завершился с ошибкой

1. exit(errno)
2. отрицательные коды ошибок используются в ядре

Добавлено через 2 минуты и 35 секунд
Цитата(DissDoc @  6.6.2007,  09:21 Найти цитируемый пост)
Что значит exit(0); close(0);

exit(0) - завершение процесса с нулевым кодом возврата + вызов всех функций, которые были зарегистрированы средой
close(0) - в общем смысле - уменьшение счетчика ссылок на открытый файл и его удаление в случае если этот счетчик после очередного уменьшения стал нулевым

Автор: BlackStar 7.6.2007, 11:49
man stdin 

stdin = 0
stdout = 1
stderr = 2

close(0) == close(stdin)

Зачем он нужен в приведенном куске кода, понятия не имею.

Автор: MAKCim 7.6.2007, 12:11
Цитата(BlackStar @  7.6.2007,  11:49 Найти цитируемый пост)
close(0) == close(stdin)

stdin имеет тип FILE*
так что close(STDIN_FILENO) или fclose(stdin)

Автор: Nil 7.6.2007, 12:34
MAKCim, 
А разве STDIN_FILENO не макрос который в итоге даст тот же 0 ?
----
Добавлено:
Прошу прощения, не верно прочитал предыдущий пост.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)