From: Ilia Alshanetsky Date: Tue, 18 Feb 2003 01:41:06 +0000 (+0000) Subject: Added pcntl_setpriority & pcntl_getpriority(). These functions can be used X-Git-Tag: RELEASE_0_5~922 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0503336ede0df8b683bc3e6339adc4800d8af066;p=php Added pcntl_setpriority & pcntl_getpriority(). These functions can be used to fetch and alter the priority of a process. --- diff --git a/ext/pcntl/config.m4 b/ext/pcntl/config.m4 index f24f038cb9..1675173474 100644 --- a/ext/pcntl/config.m4 +++ b/ext/pcntl/config.m4 @@ -13,6 +13,9 @@ if test "$PHP_PCNTL" != "no"; then AC_CHECK_FUNCS(fork, [ AC_DEFINE(HAVE_FORK,1,[ ]) ], [ AC_MSG_ERROR(pcntl: fork() not supported by this platform) ]) AC_CHECK_FUNCS(waitpid, [ AC_DEFINE(HAVE_WAITPID,1,[ ]) ], [ AC_MSG_ERROR(pcntl: fork() not supported by this platform) ]) AC_CHECK_FUNCS(sigaction, [ AC_DEFINE(HAVE_SIGACTION,1,[ ]) ], [ AC_MSG_ERROR(pcntl: sigaction() not supported by this platform) ]) - + + PHP_CHECK_FUNC(getpriority) + PHP_CHECK_FUNC(setpriority) + PHP_NEW_EXTENSION(pcntl, pcntl.c php_signal.c, $ext_shared, cli) fi diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index 6c986d8c66..bc639c15b7 100755 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -36,6 +36,11 @@ #include "ext/standard/info.h" #include "php_pcntl.h" +#if HAVE_GETPRIORITY || HAVE_SETPRIORITY +#include +#include +#endif + ZEND_DECLARE_MODULE_GLOBALS(pcntl) function_entry pcntl_functions[] = { @@ -50,6 +55,8 @@ function_entry pcntl_functions[] = { PHP_FE(pcntl_wstopsig, NULL) PHP_FE(pcntl_exec, NULL) PHP_FE(pcntl_alarm, NULL) + PHP_FE(pcntl_getpriority, NULL) + PHP_FE(pcntl_setpriority, NULL) {NULL, NULL, NULL} }; @@ -132,6 +139,12 @@ void php_register_signal_constants(INIT_FUNC_ARGS) #endif REGISTER_LONG_CONSTANT("SIGSYS", (long) SIGSYS, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SIGBABY", (long) SIGSYS, CONST_CS | CONST_PERSISTENT); + +#if HAVE_GETPRIORITY || HAVE_SETPRIORITY + REGISTER_LONG_CONSTANT("PRIO_PGRP", PRIO_PGRP, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("PRIO_USER", PRIO_USER, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("PRIO_PROCESS", PRIO_PROCESS, CONST_CS | CONST_PERSISTENT); +#endif } static void php_pcntl_init_globals(zend_pcntl_globals *pcntl_globals) @@ -494,6 +507,83 @@ PHP_FUNCTION(pcntl_signal) } /* }}} */ +#ifdef HAVE_GETPRIORITY +/* {{{ proto int pcntl_getpriority(int pid, [int process_identifier]]) + Get the priority of any process */ +PHP_FUNCTION(pcntl_getpriority) +{ + long who = PRIO_PROCESS; + long pid = getpid(); + int pri; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ll", &pid, &who) == FAILURE) { + RETURN_FALSE; + } + + /* needs to be cleared, since any returned value is valid */ + errno = 0; + + pri = getpriority(who, pid); + + if (errno) { + switch (errno) { + case ESRCH: + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%l: No process was located using the given parameters.", errno); + break; + case EINVAL: + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%l: Invalid identifier flag.", errno); + break; + default: + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown error %l has occured.", errno); + break; + } + RETURN_FALSE; + } + + RETURN_LONG(pri); +} +/* }}} */ +#endif + +#ifdef HAVE_SETPRIORITY +/* {{{ proto bool pcntl_setpriority(int priority, [int pid, [int process_identifier]]) + Change the priority of any process */ +PHP_FUNCTION(pcntl_setpriority) +{ + long who = PRIO_PROCESS; + long pid = getpid(); + long pri; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|ll", &pri, &pid, &who) == FAILURE) { + RETURN_FALSE; + } + + if (setpriority(who, pid, pri)) { + switch (errno) { + case ESRCH: + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%l: No process was located using the given parameters.", errno); + break; + case EINVAL: + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%l: Invalid identifier flag.", errno); + break; + case EPERM: + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%l: A process was located, but neither its effective nor real user ID matched the effective user ID of the caller.", errno); + break; + case EACCES: + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%l: Only a super user may attempt to increase the process priority.", errno); + break; + default: + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown error %l has occured.", errno); + break; + } + RETURN_FALSE; + } + + RETURN_TRUE; +} +/* }}} */ +#endif + /* Our custom signal handler that calls the appropriate php_function */ static void pcntl_signal_handler(int signo) { diff --git a/ext/pcntl/php_pcntl.h b/ext/pcntl/php_pcntl.h index ecbbd263d1..ccca57813f 100644 --- a/ext/pcntl/php_pcntl.h +++ b/ext/pcntl/php_pcntl.h @@ -50,6 +50,8 @@ PHP_FUNCTION(pcntl_wtermsig); PHP_FUNCTION(pcntl_wstopsig); PHP_FUNCTION(pcntl_signal); PHP_FUNCTION(pcntl_exec); +PHP_FUNCTION(pcntl_getpriority); +PHP_FUNCTION(pcntl_setpriority); static void pcntl_signal_handler(int); static void pcntl_tick_handler();