Browse Source

Added pcntl_setpriority & pcntl_getpriority(). These functions can be used

to fetch and alter the priority of a process.
PHP-5
Ilia Alshanetsky 24 years ago
parent
commit
0503336ede
  1. 5
      ext/pcntl/config.m4
  2. 90
      ext/pcntl/pcntl.c
  3. 2
      ext/pcntl/php_pcntl.h

5
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

90
ext/pcntl/pcntl.c

@ -36,6 +36,11 @@
#include "ext/standard/info.h"
#include "php_pcntl.h"
#if HAVE_GETPRIORITY || HAVE_SETPRIORITY
#include <sys/time.h>
#include <sys/resource.h>
#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)
{

2
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();

Loading…
Cancel
Save