📄 apr_thread_proc.h
字号:
/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */#ifndef APR_THREAD_PROC_H#define APR_THREAD_PROC_H/** * @file apr_thread_proc.h * @brief APR Thread and Process Library */#include "apr.h"#include "apr_file_io.h"#include "apr_pools.h"#include "apr_errno.h"#if APR_HAVE_STRUCT_RLIMIT#include <sys/time.h>#include <sys/resource.h>#endif#ifdef __cplusplusextern "C" {#endif /* __cplusplus *//** * @defgroup apr_thread_proc Threads and Process Functions * @ingroup APR * @{ */typedef enum { APR_SHELLCMD, /**< use the shell to invoke the program */ APR_PROGRAM, /**< invoke the program directly, no copied env */ APR_PROGRAM_ENV, /**< invoke the program, replicating our environment */ APR_PROGRAM_PATH, /**< find program on PATH, use our environment */ APR_SHELLCMD_ENV /**< use the shell to invoke the program, * replicating our environment */} apr_cmdtype_e;typedef enum { APR_WAIT, /**< wait for the specified process to finish */ APR_NOWAIT /**< do not wait -- just see if it has finished */} apr_wait_how_e;/* I am specifically calling out the values so that the macros below make * more sense. Yes, I know I don't need to, but I am hoping this makes what * I am doing more clear. If you want to add more reasons to exit, continue * to use bitmasks. */typedef enum { APR_PROC_EXIT = 1, /**< process exited normally */ APR_PROC_SIGNAL = 2, /**< process exited due to a signal */ APR_PROC_SIGNAL_CORE = 4 /**< process exited and dumped a core file */} apr_exit_why_e;/** did we exit the process */#define APR_PROC_CHECK_EXIT(x) (x & APR_PROC_EXIT)/** did we get a signal */#define APR_PROC_CHECK_SIGNALED(x) (x & APR_PROC_SIGNAL)/** did we get core */#define APR_PROC_CHECK_CORE_DUMP(x) (x & APR_PROC_SIGNAL_CORE)/** @see apr_procattr_io_set */#define APR_NO_PIPE 0/** @see apr_procattr_io_set */#define APR_FULL_BLOCK 1/** @see apr_procattr_io_set */#define APR_FULL_NONBLOCK 2/** @see apr_procattr_io_set */#define APR_PARENT_BLOCK 3/** @see apr_procattr_io_set */#define APR_CHILD_BLOCK 4/** @see apr_procattr_limit_set */#define APR_LIMIT_CPU 0/** @see apr_procattr_limit_set */#define APR_LIMIT_MEM 1/** @see apr_procattr_limit_set */#define APR_LIMIT_NPROC 2/** @see apr_procattr_limit_set */#define APR_LIMIT_NOFILE 3/** * @defgroup APR_OC Other Child Flags * @{ */#define APR_OC_REASON_DEATH 0 /**< child has died, caller must call * unregister still */#define APR_OC_REASON_UNWRITABLE 1 /**< write_fd is unwritable */#define APR_OC_REASON_RESTART 2 /**< a restart is occuring, perform * any necessary cleanup (including * sending a special signal to child) */#define APR_OC_REASON_UNREGISTER 3 /**< unregister has been called, do * whatever is necessary (including * kill the child) */#define APR_OC_REASON_LOST 4 /**< somehow the child exited without * us knowing ... buggy os? */#define APR_OC_REASON_RUNNING 5 /**< a health check is occuring, * for most maintainence functions * this is a no-op. *//** @} *//** The APR process type */typedef struct apr_proc_t { /** The process ID */ pid_t pid; /** Parent's side of pipe to child's stdin */ apr_file_t *in; /** Parent's side of pipe to child's stdout */ apr_file_t *out; /** Parent's side of pipe to child's stdouterr */ apr_file_t *err;#if APR_HAS_PROC_INVOKED || defined(DOXYGEN) /** Diagnositics/debugging string of the command invoked for * this process [only present if APR_HAS_PROC_INVOKED is true] * @remark Only enabled on Win32 by default. * @bug This should either always or never be present in release * builds - since it breaks binary compatibility. We may enable * it always in APR 1.0 yet leave it undefined in most cases. */ char *invoked;#endif#if defined(WIN32) || defined(DOXYGEN) /** (Win32 only) Creator's handle granting access to the process * @remark This handle is closed and reset to NULL in every case * corresponding to a waitpid() on Unix which returns the exit status. * Therefore Win32 correspond's to Unix's zombie reaping characteristics * and avoids potential handle leaks. */ HANDLE hproc;#endif} apr_proc_t;/** * The prototype for APR child errfn functions. (See the description * of apr_procattr_child_errfn_set() for more information.) * It is passed the following parameters: * @param pool Pool associated with the apr_proc_t. If your child * error function needs user data, associate it with this * pool. * @param err APR error code describing the error * @param description Text description of type of processing which failed */typedef void (apr_child_errfn_t)(apr_pool_t *proc, apr_status_t err, const char *description);/** Opaque Thread structure. */typedef struct apr_thread_t apr_thread_t;/** Opaque Thread attributes structure. */typedef struct apr_threadattr_t apr_threadattr_t;/** Opaque Process attributes structure. */typedef struct apr_procattr_t apr_procattr_t;/** Opaque control variable for one-time atomic variables. */typedef struct apr_thread_once_t apr_thread_once_t;/** Opaque thread private address space. */typedef struct apr_threadkey_t apr_threadkey_t;/** Opaque record of child process. */typedef struct apr_other_child_rec_t apr_other_child_rec_t;/** * The prototype for any APR thread worker functions. */typedef void *(APR_THREAD_FUNC *apr_thread_start_t)(apr_thread_t*, void*);typedef enum { APR_KILL_NEVER, /**< process is never sent any signals */ APR_KILL_ALWAYS, /**< process is sent SIGKILL on apr_pool_t cleanup */ APR_KILL_AFTER_TIMEOUT, /**< SIGTERM, wait 3 seconds, SIGKILL */ APR_JUST_WAIT, /**< wait forever for the process to complete */ APR_KILL_ONLY_ONCE /**< send SIGTERM and then wait */} apr_kill_conditions_e;/* Thread Function definitions */#if APR_HAS_THREADS/** * Create and initialize a new threadattr variable * @param new_attr The newly created threadattr. * @param cont The pool to use */APR_DECLARE(apr_status_t) apr_threadattr_create(apr_threadattr_t **new_attr, apr_pool_t *cont);/** * Set if newly created threads should be created in detached state. * @param attr The threadattr to affect * @param on Thread detach state on or off */APR_DECLARE(apr_status_t) apr_threadattr_detach_set(apr_threadattr_t *attr, apr_int32_t on);/** * Get the detach state for this threadattr. * @param attr The threadattr to reference */APR_DECLARE(apr_status_t) apr_threadattr_detach_get(apr_threadattr_t *attr);/** * Set the stack size of newly created threads. * @param attr The threadattr to affect * @param stacksize The stack size in bytes */APR_DECLARE(apr_status_t) apr_threadattr_stacksize_set(apr_threadattr_t *attr, apr_size_t stacksize);/** * Create a new thread of execution * @param new_thread The newly created thread handle. * @param attr The threadattr to use to determine how to create the thread * @param func The function to start the new thread in * @param data Any data to be passed to the starting function * @param cont The pool to use */APR_DECLARE(apr_status_t) apr_thread_create(apr_thread_t **new_thread, apr_threadattr_t *attr, apr_thread_start_t func, void *data, apr_pool_t *cont);/** * stop the current thread * @param thd The thread to stop * @param retval The return value to pass back to any thread that cares */APR_DECLARE(apr_status_t) apr_thread_exit(apr_thread_t *thd, apr_status_t retval);/** * block until the desired thread stops executing. * @param retval The return value from the dead thread. * @param thd The thread to join */APR_DECLARE(apr_status_t) apr_thread_join(apr_status_t *retval, apr_thread_t *thd);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -