2015-11-08 5 views
0

В настоящее время я пишу программу на C, и одно из ограничений заключается в том, что я не могу вызывать внешние программы, используя system. Вместо этого мне нужно работать в пределах идиомы языка, используя системные вызовы из библиотеки C/C++. У меня возникают проблемы с пониманием разницы между «системными» вызовами и вызовами «C/C++ system».Системные вызовы с системными вызовами C/C++

Is system просто зависит от платформы, в то время как вызовы системы «C» строят ontop system и автоматически изменяет его выполнение на основе используемой платформы?

Надеюсь, мой вопрос ясен. Заранее спасибо!

+0

Не могли бы вы привести пример внешней программы, которую вы хотите вызвать? –

+0

Вы имеете в виду 'fread' и' fopen' или, скорее, 'open' и' read'? – Downvoter

+1

Да, 'system' просто порождает команду оболочки, чтобы запустить любую двоичную (или встроенную оболочку), о которой вы просите. Системный вызов - это вызов «функции» ядра, функция, что ядро ​​является единственным, способным выполнять (то есть «действительно» доступ к аппаратным средствам). Конечно, программа, созданная 'system', может/будет использовать системные вызовы. Я предполагаю, что цель состоит в том, чтобы заставить вас сделать все это, не полагаясь на существующий бинарный файл, который сделает это за вас. – hexasoft

ответ

2

Linux на базе операционных систем разоблачить функциональность двумя способами:

  • инструментов командной строки через оболочку
  • системы вызывает через C язык

Например, для создания каталога:

Используя оболочку, то mkdir со mmand, см. http://linux.die.net/man/1/mkdir. Функция system С вызывает оболочку для вызова такой команды:

system("mkdir foo"); 

Соответствующая система вызова также называется mkdir, теперь увидеть http://linux.die.net/man/2/mkdir вместо этого.

Он используется непосредственно в C, как это:

mkdir("foo", 0755); 

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

2

Термин «системный вызов» для операционных систем встроенных функций, как pipe или fork или write (на POSIX платформах, таких как Linux), это не имеет ничего общего с функцией system. Тогда у вас есть стандартная библиотека, которая указана в спецификациях C (или C++) и обычно основывается на «системных вызовах» операционной системы.

Читайте, например. this Wikipedia "system call" article, или this about standard libraries для получения дополнительной информации.

Кроме того, ни один системный вызов операционной, или C (или C++) стандартная функция библиотеки actuall не вызывает функцию system, на самом деле функция system реализуется с использованием более низкого уровня система вызывает (как fork и wait на Linux). Функция system является частью стандартной библиотеки в C и C++.

1

Функция system сама по себе порождает процесс оболочки и запускает эту программу, как если бы пользователь только что набрал ее из командной строки.

«Системные вызовы» в другом смысле - это то, что делают библиотеки времени выполнения, чтобы вызывать операционную систему, чтобы сделать что-то, что программный код не мог сделать по своему усмотрению. Например: открытие файла, запуск другого процесса и любые операции ввода-вывода. В Linux большинство этих системных вызовов отображаются как API-функции C, которые ваша программа может вызывать, выполняют эти операции (например, открывать, читать и т. Д.). Все системные вызовы Linux перечислены на странице руководства здесь: http://man7.org/linux/man-pages/man2/syscalls.2.html

+0

Я думаю, что это многое проясняет для меня. В других словах, если я выполняю системный вызов, например, открывать/читать через библиотеку C, он все равно будет считаться «внутри языка» правильным? – Geebs

+0

Да, но уточните у человека, который дал вам это задание. – selbie

Смежные вопросы