#include <stdlib.h> int system(const char * string);
Если string равно NULL, то system() возвращает ненулевой результат при условии, что есть доступ к оболочке shell, и ноль, если доступа нет.
system() не отражается на дочерних процессах.
Крайне неудобно, что
system()
игнорирует SIGINT и SIGQUIT. Это может привести к тому что
программы вызывающие ее из цикла станут неприрываемыми, пока сами
не проверят условия выхода для своих дочерних процессов. Например,
while(something) { int ret = system("foo"); if (WIFSIGNALED(ret) && (WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT)) break;
Не используйте system() в программах с привилегиями suid или sgid, потому что некоторые значения переменных окружения могут вызвать сбои в системе. Вместо нее рекомендуется использование семейства функций exec(3), но не execlp(3) или execvp(3). system() неправильно функционирует в программах с привилегиями suid или sgid тех систем, где /bin/sh заменено на bash версии 2, так как bash 2 обнуляет права при запуске. Debian использует измененный bash, который не производит при запуске этого действия так, как это делает sh.
Проверка доступности /bin/sh не производится, так как всегда подразумевается, что доступ к нему есть. ISO C описывает процесс проверки, а POSIX.2 говорит, что возвращаемое значение никогда не равно нулю, так как shell всегда считается установленным.
Существует возможность, что команда оболочки возвратит значение 127, но это неявное доказательство неуспешного вызова execve(); проверьте errno для того, чтобы в этом удостовериться.
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |