本文整理汇总了C++中sigprocmask函数的典型用法代码示例。如果您正苦于以下问题:C++ sigprocmask函数的具体用法?C++ sigprocmask怎么用?C++ sigprocmask使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了sigprocmask函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ar_next
int
ar_next(void)
{
static char *arcbuf;
char buf[PAXPATHLEN+2];
sigset_t o_mask;
/*
* WE MUST CLOSE THE DEVICE. A lot of devices must see last close, (so
* things like writing EOF etc will be done) (Watch out ar_close() can
* also be called via a signal handler, so we must prevent a race.
*/
if (sigprocmask(SIG_BLOCK, &s_mask, &o_mask) < 0)
syswarn(0, errno, "Unable to set signal mask");
ar_close();
if (sigprocmask(SIG_SETMASK, &o_mask, NULL) < 0)
syswarn(0, errno, "Unable to restore signal mask");
if (done || !wr_trail || strcmp(NM_TAR, argv0) == 0)
return(-1);
tty_prnt("\nATTENTION! %s archive volume change required.\n", argv0);
/*
* if i/o is on stdin or stdout, we cannot reopen it (we do not know
* the name), the user will be forced to type it in.
*/
if (strcmp(arcname, stdo) && strcmp(arcname, stdn) && (artyp != ISREG)
&& (artyp != ISPIPE)) {
if (artyp == ISTAPE) {
tty_prnt("%s ready for archive tape volume: %d\n",
arcname, arvol);
tty_prnt("Load the NEXT TAPE on the tape drive");
} else {
tty_prnt("%s ready for archive volume: %d\n",
arcname, arvol);
tty_prnt("Load the NEXT STORAGE MEDIA (if required)");
}
if ((act == ARCHIVE) || (act == APPND))
tty_prnt(" and make sure it is WRITE ENABLED.\n");
else
tty_prnt("\n");
for(;;) {
tty_prnt("Type \"y\" to continue, \".\" to quit %s,",
argv0);
tty_prnt(" or \"s\" to switch to new device.\nIf you");
tty_prnt(" cannot change storage media, type \"s\"\n");
tty_prnt("Is the device ready and online? > ");
if ((tty_read(buf,sizeof(buf))<0) || !strcmp(buf,".")){
done = 1;
lstrval = -1;
tty_prnt("Quitting %s!\n", argv0);
vfpart = 0;
return(-1);
}
if ((buf[0] == '\0') || (buf[1] != '\0')) {
tty_prnt("%s unknown command, try again\n",buf);
continue;
}
switch (buf[0]) {
case 'y':
case 'Y':
/*
* we are to continue with the same device
*/
if (ar_open(arcname) >= 0)
return(0);
tty_prnt("Cannot re-open %s, try again\n",
arcname);
continue;
case 's':
case 'S':
/*
* user wants to open a different device
*/
tty_prnt("Switching to a different archive\n");
break;
default:
tty_prnt("%s unknown command, try again\n",buf);
continue;
}
break;
}
} else
tty_prnt("Ready for archive volume: %d\n", arvol);
/*
* have to go to a different archive
*/
for (;;) {
tty_prnt("Input archive name or \".\" to quit %s.\n", argv0);
tty_prnt("Archive name > ");
if ((tty_read(buf, sizeof(buf)) < 0) || !strcmp(buf, ".")) {
done = 1;
//.........这里部分代码省略.........
示例2: main
//.........这里部分代码省略.........
break;
case 'v':
printf("perfalloc " VERSION "\n" );
exit(EXIT_SUCCESS);
break;
default: /* '?' */
usage(argv[0]);
exit(EXIT_FAILURE);
}
}
if( optind < argc )
{
runmode = RUN_USERCOMMAND;
}
if(RUN_AS_DAEMON == runmode)
{
if( -1 == daemon(0,0) ) {
perror("fork");
exit(EXIT_FAILURE);
}
}
else if (RUN_USERCOMMAND == runmode)
{
pid = fork();
if (pid == -1)
{
perror("fork");
exit(EXIT_FAILURE);
}
if (pid != 0)
{ /* Parent - execute the given command. */
execvp(argv[optind], &argv[optind]);
perror(argv[optind]);
exit(EXIT_FAILURE);
}
/* Child - make sure that kernel signals when parent dies */
prctl(PR_SET_PDEATHSIG, SIGHUP);
if ( -1 == chdir("/") ) {
perror("chdir");
/* carry on even if chdir fails ..*/
}
if ((fd = open("/dev/null", O_RDWR, 0)) != -1)
{
(void) dup2(fd, STDIN_FILENO);
(void) dup2(fd, STDOUT_FILENO);
(void) dup2(fd, STDERR_FILENO);
if (fd > 2)
close(fd);
}
}
fp = open(lockfile, O_RDONLY);
if( fp < 0 ) {
fprintf(stderr, "open %s: %s\n", lockfile, strerror(errno) );
exit(EXIT_FAILURE);
}
fl.l_type = F_RDLCK;
fl.l_whence = SEEK_SET;
fl.l_start = 0;
fl.l_len = 1;
res = fcntl(fp, F_SETLK, &fl);
if( res == -1 )
{
perror("fcntl");
close(fp);
exit(EXIT_FAILURE);
}
signal (SIGINT, handler);
signal (SIGHUP, handler);
sigemptyset (&set);
sigaddset(&set, SIGINT);
sigaddset(&set, SIGHUP);
sigprocmask(SIG_BLOCK, &set, &oldset);
while(running)
{
sigsuspend(&oldset);
}
sigprocmask(SIG_UNBLOCK, &set, NULL);
fl.l_type = F_UNLCK;
(void) fcntl(fp, F_SETLK, &fl);
(void) close(fp);
free_perf_alloc_lockfile();
return 0;
}
示例3: handler
/*
* handler()
*
* A signal handler that understands which test case is currently
* being executed and compares the current conditions to the ones it
* expects (based on the test case number).
*/
void handler(int sig, siginfo_t * sip, void *ucp)
{
struct sigaction oact;
int err;
sigset_t nmask, omask;
/*
* Get sigaction setting
*/
err = sigaction(SIGUSR1, NULL, &oact);
if (err == -1) {
perror("sigaction");
return;
}
/*
* Get current signal mask
*/
sigemptyset(&nmask);
sigemptyset(&omask);
err = sigprocmask(SIG_BLOCK, &nmask, &omask);
if (err == -1) {
perror("sigprocmask");
tst_resm(TWARN, "sigprocmask() failed");
return;
}
switch (testcase_no) {
case 1:
/*
* SA_RESETHAND and SA_SIGINFO were set. SA_SIGINFO should
* be clear in Linux. In Linux kernel, SA_SIGINFO is not
* cleared in psig().
*/
if (!(oact.sa_flags & SA_SIGINFO)) {
tst_resm(TFAIL, "SA_RESETHAND should not "
"cause SA_SIGINFO to be cleared, but it was.");
return;
}
if (sip == NULL) {
tst_resm(TFAIL, "siginfo should not be NULL");
return;
}
tst_resm(TPASS, "SA_RESETHAND did not "
"cause SA_SIGINFO to be cleared");
break;
case 2:
/*
* In Linux, SA_RESETHAND doesn't imply SA_NODEFER; sig
* should not be masked. The testcase should pass if
* SA_NODEFER is not masked, ie. if SA_NODEFER is a member
* of the signal list
*/
if (sigismember(&omask, sig) == 0) {
tst_resm(TFAIL, "SA_RESETHAND should cause sig to"
"be masked when the handler executes.");
return;
}
tst_resm(TPASS, "SA_RESETHAND was masked when handler "
"executed");
break;
case 3:
/*
* SA_RESETHAND implies SA_NODEFER unless sa_mask already
* included sig.
*/
if (!sigismember(&omask, sig)) {
tst_resm(TFAIL, "sig should continue to be masked"
"because sa_mask originally contained sig.");
return;
}
tst_resm(TPASS, "sig has been masked "
"because sa_mask originally contained sig");
break;
case 4:
/*
* A signal generated from a mechanism that does not provide
* siginfo should invoke the handler with a non-NULL siginfo
* pointer.
*/
if (sip == NULL) {
tst_resm(TFAIL, "siginfo pointer should not be NULL");
return;
}
tst_resm(TPASS, "siginfo pointer non NULL");
break;
default:
tst_resm(TFAIL, "invalid test case number: %d", testcase_no);
//.........这里部分代码省略.........
示例4: pthread_initialize
static void pthread_initialize(void)
{
struct sigaction sa;
sigset_t mask;
#ifdef __ARCH_USE_MMU__
struct rlimit limit;
rlim_t max_stack;
#endif
/* If already done (e.g. by a constructor called earlier!), bail out */
if (__pthread_initial_thread_bos != NULL) return;
#ifdef TEST_FOR_COMPARE_AND_SWAP
/* Test if compare-and-swap is available */
__pthread_has_cas = compare_and_swap_is_available();
#endif
/* For the initial stack, reserve at least STACK_SIZE bytes of stack
below the current stack address, and align that on a
STACK_SIZE boundary. */
__pthread_initial_thread_bos =
(char *)(((long)CURRENT_STACK_FRAME - 2 * STACK_SIZE) & ~(STACK_SIZE - 1));
/* Update the descriptor for the initial thread. */
__pthread_initial_thread.p_pid = getpid();
/* If we have special thread_self processing, initialize that for the
main thread now. */
#ifdef INIT_THREAD_SELF
INIT_THREAD_SELF(&__pthread_initial_thread, 0);
#endif
/* The errno/h_errno variable of the main thread are the global ones. */
__pthread_initial_thread.p_errnop = &_errno;
__pthread_initial_thread.p_h_errnop = &_h_errno;
#ifdef __UCLIBC_HAS_XLOCALE__
/* The locale of the main thread is the current locale in use. */
__pthread_initial_thread.locale = __curlocale_var;
#endif /* __UCLIBC_HAS_XLOCALE__ */
{ /* uClibc-specific stdio initialization for threads. */
FILE *fp;
_stdio_user_locking = 0; /* 2 if threading not initialized */
for (fp = _stdio_openlist; fp != NULL; fp = fp->__nextopen) {
if (fp->__user_locking != 1) {
fp->__user_locking = 0;
}
}
}
/* Play with the stack size limit to make sure that no stack ever grows
beyond STACK_SIZE minus two pages (one page for the thread descriptor
immediately beyond, and one page to act as a guard page). */
#ifdef __ARCH_USE_MMU__
/* We cannot allocate a huge chunk of memory to mmap all thread stacks later
* on a non-MMU system. Thus, we don't need the rlimit either. -StS */
getrlimit(RLIMIT_STACK, &limit);
max_stack = STACK_SIZE - 2 * getpagesize();
if (limit.rlim_cur > max_stack) {
limit.rlim_cur = max_stack;
setrlimit(RLIMIT_STACK, &limit);
}
#else
/* For non-MMU, the initial thread stack can reside anywhere in memory.
* We don't have a way of knowing where the kernel started things -- top
* or bottom (well, that isn't exactly true, but the solution is fairly
* complex and error prone). All we can determine here is an address
* that lies within that stack. Save that address as a reference so that
* as other thread stacks are created, we can adjust the estimated bounds
* of the initial thread's stack appropriately.
*
* This checking is handled in NOMMU_INITIAL_THREAD_BOUNDS(), so see that
* for a few more details.
*/
__pthread_initial_thread_mid = CURRENT_STACK_FRAME;
__pthread_initial_thread_tos = (char *) -1;
__pthread_initial_thread_bos = (char *) 1; /* set it non-zero so we know we have been here */
PDEBUG("initial thread stack bounds: bos=%p, tos=%p\n",
__pthread_initial_thread_bos, __pthread_initial_thread_tos);
#endif /* __ARCH_USE_MMU__ */
/* Setup signal handlers for the initial thread.
Since signal handlers are shared between threads, these settings
will be inherited by all other threads. */
memset(&sa, 0, sizeof(sa));
sa.sa_handler = pthread_handle_sigrestart;
__libc_sigaction(__pthread_sig_restart, &sa, NULL);
sa.sa_handler = pthread_handle_sigcancel;
sigaddset(&sa.sa_mask, __pthread_sig_restart);
__libc_sigaction(__pthread_sig_cancel, &sa, NULL);
if (__pthread_sig_debug > 0) {
sa.sa_handler = pthread_handle_sigdebug;
__sigemptyset(&sa.sa_mask);
__libc_sigaction(__pthread_sig_debug, &sa, NULL);
}
/* Initially, block __pthread_sig_restart. Will be unblocked on demand. */
__sigemptyset(&mask);
sigaddset(&mask, __pthread_sig_restart);
sigprocmask(SIG_BLOCK, &mask, NULL);
/* And unblock __pthread_sig_cancel if it has been blocked. */
sigdelset(&mask, __pthread_sig_restart);
sigaddset(&mask, __pthread_sig_cancel);
//.........这里部分代码省略.........
示例5: Sigprocmask
void Sigprocmask(int method, sigset_t *mask, sigset_t *oldmask) {
if (sigprocmask(method, mask, oldmask)) {
unix_error("Sigprocmask error");
}
}
示例6: ngx_master_process_cycle
void
ngx_master_process_cycle(ngx_cycle_t *cycle)
{
char *title;
u_char *p;
size_t size;
ngx_int_t i;
ngx_uint_t n, sigio;
sigset_t set;
struct itimerval itv;
ngx_uint_t live;
ngx_msec_t delay;
ngx_listening_t *ls;
ngx_core_conf_t *ccf;
struct rlimit rlmt;
sigemptyset(&set);
sigaddset(&set, SIGCHLD);
sigaddset(&set, SIGALRM);
sigaddset(&set, SIGIO);
sigaddset(&set, SIGINT);
sigaddset(&set, ngx_signal_value(NGX_RECONFIGURE_SIGNAL));
sigaddset(&set, ngx_signal_value(NGX_REOPEN_SIGNAL));
sigaddset(&set, ngx_signal_value(NGX_NOACCEPT_SIGNAL));
sigaddset(&set, ngx_signal_value(NGX_TERMINATE_SIGNAL));
sigaddset(&set, ngx_signal_value(NGX_SHUTDOWN_SIGNAL));
sigaddset(&set, ngx_signal_value(NGX_CHANGEBIN_SIGNAL));
if (sigprocmask(SIG_BLOCK, &set, NULL) == -1) {
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
"sigprocmask() failed");
}
sigemptyset(&set);
size = sizeof(master_process);
for (i = 0; i < ngx_argc; i++) {
size += ngx_strlen(ngx_argv[i]) + 1;
}
title = ngx_pnalloc(cycle->pool, size);
p = ngx_cpymem(title, master_process, sizeof(master_process) - 1);
for (i = 0; i < ngx_argc; i++) {
*p++ = ' ';
p = ngx_cpystrn(p, (u_char *) ngx_argv[i], size);
}
ngx_setproctitle(title);
ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
ngx_start_worker_processes(cycle, ccf->worker_processes,
NGX_PROCESS_RESPAWN);
/* The directives such as "user", "rlimit_core", etc. should also be
* effective on master process. Changed by Zimbra
*/
if (ccf->rlimit_nofile != NGX_CONF_UNSET) {
rlmt.rlim_cur = (rlim_t) ccf->rlimit_nofile;
rlmt.rlim_max = (rlim_t) ccf->rlimit_nofile;
if (setrlimit(RLIMIT_NOFILE, &rlmt) == -1) {
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
"setrlimit(RLIMIT_NOFILE, %i) failed",
ccf->rlimit_nofile);
}
}
if (ccf->rlimit_core != NGX_CONF_UNSET) {
rlmt.rlim_cur = (rlim_t) ccf->rlimit_core;
rlmt.rlim_max = (rlim_t) ccf->rlimit_core;
if (setrlimit(RLIMIT_CORE, &rlmt) == -1) {
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
"setrlimit(RLIMIT_CORE, %O) failed",
ccf->rlimit_core);
}
}
#ifdef RLIMIT_SIGPENDING
if (ccf->rlimit_sigpending != NGX_CONF_UNSET) {
rlmt.rlim_cur = (rlim_t) ccf->rlimit_sigpending;
rlmt.rlim_max = (rlim_t) ccf->rlimit_sigpending;
if (setrlimit(RLIMIT_SIGPENDING, &rlmt) == -1) {
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
"setrlimit(RLIMIT_SIGPENDING, %i) failed",
ccf->rlimit_sigpending);
}
}
#endif
if (geteuid() == 0) {
if (setgid(ccf->group) == -1) {
ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
"setgid(%d) failed", ccf->group);
/* fatal */
//.........这里部分代码省略.........
示例7: do_signal
void do_signal(struct pt_regs *regs)
{
siginfo_t info;
int signr;
struct k_sigaction ka;
/*
*/
if (!user_mode(regs))
return;
signr = get_signal_to_deliver(&info, &ka, regs, NULL);
/*
*/
if (regs->orig_gpr11) {
int restart = 0;
switch (regs->gpr[11]) {
case -ERESTART_RESTARTBLOCK:
case -ERESTARTNOHAND:
/* */
restart = (signr <= 0);
break;
case -ERESTARTSYS:
/*
*/
restart = (signr <= 0 || (ka.sa.sa_flags & SA_RESTART));
break;
case -ERESTARTNOINTR:
/* */
restart = 1;
break;
}
if (restart) {
if (regs->gpr[11] == -ERESTART_RESTARTBLOCK)
regs->gpr[11] = __NR_restart_syscall;
else
regs->gpr[11] = regs->orig_gpr11;
regs->pc -= 4;
} else {
regs->gpr[11] = -EINTR;
}
}
if (signr <= 0) {
/*
*/
if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
clear_thread_flag(TIF_RESTORE_SIGMASK);
sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL);
}
} else { /* */
sigset_t *oldset;
if (current_thread_info()->flags & _TIF_RESTORE_SIGMASK)
oldset = ¤t->saved_sigmask;
else
oldset = ¤t->blocked;
/* */
if (!handle_signal(signr, &info, &ka, oldset, regs)) {
/*
*/
clear_thread_flag(TIF_RESTORE_SIGMASK);
}
tracehook_signal_handler(signr, &info, &ka, regs,
test_thread_flag(TIF_SINGLESTEP));
}
return;
}
示例8: armour_proc_recover
int armour_proc_recover (armour_proc *proc, void *data)
{
pid_t pid;
sigset_t set;
int i, fd;
(void)data;
//pid = vfork ();
pid = fork ();
switch (pid) {
case -1:
DWARN ("fork");
return -1;
case 0:
if (proc->flags & ARPROC_SETSID) {
pid = fork ();
switch (pid) {
case -1:
DWARN ("fork");
return -1;
case 0:
setsid (); // TODO check return value
break;
default:
_exit (0);
break;
}
} else {
setpgid (0, 0);
}
/*
* remove signal mask
*/
sigprocmask (SIG_BLOCK, NULL, &set);
sigprocmask (SIG_UNBLOCK, &set, NULL);
/*
* attach file desc. 0, 1 and 2 to whatever files it used
*/
for (i = 0; i < 3; i++) {
fd = open (proc->file[i], O_RDWR);
dup2 (fd, i);
}
/*
* change working and root directory
*/
chdir (proc->cwd);
chroot (proc->root);
/*
* set uid and gid
*/
setgid (proc->gid);
setuid (proc->uid);
execve (proc->exe, proc->cmdline, proc->environ);
DWARN ("execve");
_exit (127); /* exec error! */
default:
break;
}
return 0;
}
示例9: _eval
int
_eval(char *const argv[], char *path, int timeout, int *ppid)
{
sigset_t set;
pid_t pid, ret;
int status;
int fd;
int flags;
int sig, i;
switch (pid = fork()) {
case -1: /* error */
perror("fork");
return errno;
case 0: /* child */
/* Reset signal handlers set for parent process */
for (sig = 0; sig < (_NSIG-1); sig++)
signal(sig, SIG_DFL);
/* Unblock signals if called from signal handler */
sigemptyset(&set);
sigprocmask(SIG_SETMASK, &set, NULL);
/* Clean up */
for (i=3; i<256; i++) // close un-needed fd
close(i);
ioctl(0, TIOCNOTTY, 0); // detach from current process
setsid();
/* Redirect stdout to <path> */
if (path) {
flags = O_WRONLY | O_CREAT;
if (!strncmp(path, ">>", 2)) {
/* append to <path> */
flags |= O_APPEND;
path += 2;
} else if (!strncmp(path, ">", 1)) {
/* overwrite <path> */
flags |= O_TRUNC;
path += 1;
}
if ((fd = open(path, flags, 0644)) < 0)
perror(path);
else {
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);
close(fd);
}
}
/* execute command */
setenv("PATH", SYS_EXEC_PATH, 1);
alarm(timeout);
execvp(argv[0], argv);
perror(argv[0]);
exit(errno);
default: /* parent */
if (ppid) {
*ppid = pid;
return 0;
} else {
do
ret = waitpid(pid, &status, 0);
while ((ret == -1) && (errno == EINTR));
if (ret != pid) {
perror("waitpid");
return errno;
}
if (WIFEXITED(status))
return WEXITSTATUS(status);
else
return status;
}
}
}
示例10: lxc_fini
void lxc_fini(const char *name, struct lxc_handler *handler)
{
int i, rc;
pid_t self = getpid();
char *namespaces[LXC_NS_MAX+1];
size_t namespace_count = 0;
/* The STOPPING state is there for future cleanup code
* which can take awhile
*/
lxc_set_state(name, handler, STOPPING);
for (i = 0; i < LXC_NS_MAX; i++) {
if (handler->nsfd[i] != -1) {
rc = asprintf(&namespaces[namespace_count], "%s:/proc/%d/fd/%d",
ns_info[i].proc_name, self, handler->nsfd[i]);
if (rc == -1) {
SYSERROR("failed to allocate memory");
break;
}
++namespace_count;
}
}
namespaces[namespace_count] = NULL;
if (handler->conf->reboot && setenv("LXC_TARGET", "reboot", 1)) {
SYSERROR("failed to set environment variable for stop target");
}
if (!handler->conf->reboot && setenv("LXC_TARGET", "stop", 1)) {
SYSERROR("failed to set environment variable for stop target");
}
if (run_lxc_hooks(name, "stop", handler->conf, handler->lxcpath, namespaces))
ERROR("failed to run stop hooks for container '%s'.", name);
while (namespace_count--)
free(namespaces[namespace_count]);
for (i = 0; i < LXC_NS_MAX; i++) {
if (handler->nsfd[i] != -1) {
close(handler->nsfd[i]);
handler->nsfd[i] = -1;
}
}
lxc_set_state(name, handler, STOPPED);
if (run_lxc_hooks(name, "post-stop", handler->conf, handler->lxcpath, NULL)) {
ERROR("failed to run post-stop hooks for container '%s'.", name);
if (handler->conf->reboot) {
WARN("Container will be stopped instead of rebooted.");
handler->conf->reboot = 0;
setenv("LXC_TARGET", "stop", 1);
}
}
/* reset mask set by setup_signal_fd */
if (sigprocmask(SIG_SETMASK, &handler->oldmask, NULL))
WARN("failed to restore sigprocmask");
lxc_console_delete(&handler->conf->console);
lxc_delete_tty(&handler->conf->tty_info);
close(handler->conf->maincmd_fd);
handler->conf->maincmd_fd = -1;
free(handler->name);
if (handler->ttysock[0] != -1) {
close(handler->ttysock[0]);
close(handler->ttysock[1]);
}
if (handler->conf->ephemeral == 1 && handler->conf->reboot != 1)
lxc_destroy_container_on_signal(handler, name);
cgroup_destroy(handler);
free(handler);
}
示例11: StartUp
//.........这里部分代码省略.........
/* Here we set SA_RESTART for safety, because SIGUSR1 may not be handled
* immediately. -Dan */
sig_action.sa_flags = SA_RESTART;
sigaction(SIGTERM, &sig_action, NULL);
sigaction(SIGINT, &sig_action, NULL);
sigaction(SIGHUP, &sig_action, NULL);
sigaction(SIGUSR1, &sig_action, NULL);
sigaction(SIGUSR2, &sig_action, NULL);
/* ignore dead pipe */
/* Because POSIX mandates that only signal with handlers are reset
* accross an exec*(), we do not want to propagate ignoring SIGPIPEs
* to children. Hence the dummy handler.
* Philippe Troin <[email protected]>
*/
sig_action.sa_handler = &dummyHandler;
sig_action.sa_flags = SA_RESTART;
sigaction(SIGPIPE, &sig_action, NULL);
/* handle dead children */
sig_action.sa_handler = buryChild;
sig_action.sa_flags = SA_NOCLDSTOP | SA_RESTART;
sigaction(SIGCHLD, &sig_action, NULL);
/* Now we unblock all signals, that may have been blocked by the parent
* who exec()-ed us. This can happen for example if Window Maker crashes
* and restarts itself or another window manager from the signal handler.
* In this case, the new proccess inherits the blocked signal mask and
* will no longer react to that signal, until unblocked.
* This is because the signal handler of the proccess who crashed (parent)
* didn't return, and the signal remained blocked. -Dan
*/
sigfillset(&sig_action.sa_mask);
sigprocmask(SIG_UNBLOCK, &sig_action.sa_mask, NULL);
/* handle X shutdowns a such */
XSetIOErrorHandler(handleXIO);
/* set hook for out event dispatcher in WINGs event dispatcher */
WMHookEventHandler(DispatchEvent);
/* initialize defaults stuff */
w_global.domain.wmaker = wDefaultsInitDomain("WindowMaker", True);
if (!w_global.domain.wmaker->dictionary)
wwarning(_("could not read domain \"%s\" from defaults database"), "WindowMaker");
/* read defaults that don't change until a restart and are
* screen independent */
wReadStaticDefaults(w_global.domain.wmaker ? w_global.domain.wmaker->dictionary : NULL);
/* check sanity of some values */
if (wPreferences.icon_size < 16) {
wwarning(_("icon size is configured to %i, but it's too small. Using 16 instead"),
wPreferences.icon_size);
wPreferences.icon_size = 16;
}
/* init other domains */
w_global.domain.root_menu = wDefaultsInitDomain("WMRootMenu", False);
if (!w_global.domain.root_menu->dictionary)
wwarning(_("could not read domain \"%s\" from defaults database"), "WMRootMenu");
wDefaultsMergeGlobalMenus(w_global.domain.root_menu);
w_global.domain.window_attr = wDefaultsInitDomain("WMWindowAttributes", True);
if (!w_global.domain.window_attr->dictionary)
示例12: malloc
struct lxc_handler *lxc_init(const char *name, struct lxc_conf *conf, const char *lxcpath)
{
int i;
struct lxc_handler *handler;
handler = malloc(sizeof(*handler));
if (!handler)
return NULL;
memset(handler, 0, sizeof(*handler));
handler->ttysock[0] = handler->ttysock[1] = -1;
handler->conf = conf;
handler->lxcpath = lxcpath;
handler->pinfd = -1;
for (i = 0; i < LXC_NS_MAX; i++)
handler->nsfd[i] = -1;
lsm_init();
handler->name = strdup(name);
if (!handler->name) {
ERROR("failed to allocate memory");
goto out_free;
}
if (lxc_cmd_init(name, handler, lxcpath))
goto out_free_name;
if (lxc_read_seccomp_config(conf) != 0) {
ERROR("failed loading seccomp policy");
goto out_close_maincmd_fd;
}
/* Begin by setting the state to STARTING */
if (lxc_set_state(name, handler, STARTING)) {
ERROR("failed to set state '%s'", lxc_state2str(STARTING));
goto out_close_maincmd_fd;
}
/* Start of environment variable setup for hooks */
if (name && setenv("LXC_NAME", name, 1)) {
SYSERROR("failed to set environment variable for container name");
}
if (conf->rcfile && setenv("LXC_CONFIG_FILE", conf->rcfile, 1)) {
SYSERROR("failed to set environment variable for config path");
}
if (conf->rootfs.mount && setenv("LXC_ROOTFS_MOUNT", conf->rootfs.mount, 1)) {
SYSERROR("failed to set environment variable for rootfs mount");
}
if (conf->rootfs.path && setenv("LXC_ROOTFS_PATH", conf->rootfs.path, 1)) {
SYSERROR("failed to set environment variable for rootfs mount");
}
if (conf->console.path && setenv("LXC_CONSOLE", conf->console.path, 1)) {
SYSERROR("failed to set environment variable for console path");
}
if (conf->console.log_path && setenv("LXC_CONSOLE_LOGPATH", conf->console.log_path, 1)) {
SYSERROR("failed to set environment variable for console log");
}
if (setenv("LXC_CGNS_AWARE", "1", 1)) {
SYSERROR("failed to set LXC_CGNS_AWARE environment variable");
}
/* End of environment variable setup for hooks */
if (run_lxc_hooks(name, "pre-start", conf, handler->lxcpath, NULL)) {
ERROR("failed to run pre-start hooks for container '%s'.", name);
goto out_aborting;
}
/* the signal fd has to be created before forking otherwise
* if the child process exits before we setup the signal fd,
* the event will be lost and the command will be stuck */
handler->sigfd = setup_signal_fd(&handler->oldmask);
if (handler->sigfd < 0) {
ERROR("failed to set sigchild fd handler");
goto out_delete_tty;
}
/* do this after setting up signals since it might unblock SIGWINCH */
if (lxc_console_create(conf)) {
ERROR("failed to create console");
goto out_restore_sigmask;
}
if (ttys_shift_ids(conf) < 0) {
ERROR("Failed to shift tty into container");
goto out_restore_sigmask;
}
INFO("'%s' is initialized", name);
return handler;
out_restore_sigmask:
sigprocmask(SIG_SETMASK, &handler->oldmask, NULL);
out_delete_tty:
lxc_delete_tty(&conf->tty_info);
out_aborting:
lxc_set_state(name, handler, ABORTING);
out_close_maincmd_fd:
//.........这里部分代码省略.........
示例13: restore_sigs
static void restore_sigs(sigset_t *oldset)
{
sigprocmask(SIG_SETMASK, oldset, NULL);
}
示例14: recv_fd
static int recv_fd(int c)
{
int fd;
uint8_t msgbuf[CMSG_SPACE(sizeof(fd))];
struct msghdr msg = {
.msg_control = msgbuf,
.msg_controllen = sizeof(msgbuf),
};
struct cmsghdr *cmsg;
struct iovec iov;
uint8_t req[1];
ssize_t len;
cmsg = CMSG_FIRSTHDR(&msg);
cmsg->cmsg_level = SOL_SOCKET;
cmsg->cmsg_type = SCM_RIGHTS;
cmsg->cmsg_len = CMSG_LEN(sizeof(fd));
msg.msg_controllen = cmsg->cmsg_len;
iov.iov_base = req;
iov.iov_len = sizeof(req);
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
len = recvmsg(c, &msg, 0);
if (len > 0) {
memcpy(&fd, CMSG_DATA(cmsg), sizeof(fd));
return fd;
}
return len;
}
static int net_bridge_run_helper(const char *helper, const char *bridge)
{
sigset_t oldmask, mask;
int pid, status;
char *args[5];
char **parg;
int sv[2];
sigemptyset(&mask);
sigaddset(&mask, SIGCHLD);
sigprocmask(SIG_BLOCK, &mask, &oldmask);
if (socketpair(PF_UNIX, SOCK_STREAM, 0, sv) == -1) {
return -1;
}
/* try to launch bridge helper */
pid = fork();
if (pid == 0) {
int open_max = sysconf(_SC_OPEN_MAX), i;
char fd_buf[6+10];
char br_buf[6+IFNAMSIZ] = {0};
char helper_cmd[PATH_MAX + sizeof(fd_buf) + sizeof(br_buf) + 15];
for (i = 0; i < open_max; i++) {
if (i != STDIN_FILENO &&
i != STDOUT_FILENO &&
i != STDERR_FILENO &&
i != sv[1]) {
close(i);
}
}
snprintf(fd_buf, sizeof(fd_buf), "%s%d", "--fd=", sv[1]);
if (strrchr(helper, ' ') || strrchr(helper, '\t')) {
/* assume helper is a command */
if (strstr(helper, "--br=") == NULL) {
snprintf(br_buf, sizeof(br_buf), "%s%s", "--br=", bridge);
}
snprintf(helper_cmd, sizeof(helper_cmd), "%s %s %s %s",
helper, "--use-vnet", fd_buf, br_buf);
parg = args;
*parg++ = (char *)"sh";
*parg++ = (char *)"-c";
*parg++ = helper_cmd;
*parg++ = NULL;
execv("/bin/sh", args);
} else {
/* assume helper is just the executable path name */
snprintf(br_buf, sizeof(br_buf), "%s%s", "--br=", bridge);
parg = args;
*parg++ = (char *)helper;
*parg++ = (char *)"--use-vnet";
*parg++ = fd_buf;
*parg++ = br_buf;
*parg++ = NULL;
execv(helper, args);
}
//.........这里部分代码省略.........
示例15: info_signal_proc
static RETSIGTYPE
info_signal_proc (int sig)
{
signal_info *old_signal_handler = NULL;
#if !defined (HAVE_SIGACTION)
/* best effort: first increment this counter and later block signals */
if (term_conf_busy)
return;
term_conf_busy++;
#if defined (HAVE_SIGPROCMASK) || defined (HAVE_SIGSETMASK)
{
sigset_t nvar, ovar;
sigemptyset (&nvar);
mask_termsig (&nvar);
sigprocmask (SIG_BLOCK, &nvar, &ovar);
}
#endif /* HAVE_SIGPROCMASK || HAVE_SIGSETMASK */
#endif /* !HAVE_SIGACTION */
switch (sig)
{
#if defined (SIGTSTP)
case SIGTSTP:
case SIGTTOU:
case SIGTTIN:
#endif
#if defined (SIGQUIT)
case SIGQUIT:
#endif
#if defined (SIGINT)
case SIGINT:
#endif
#if defined (SIGTERM)
case SIGTERM:
#endif
{
#if defined (SIGTSTP)
if (sig == SIGTSTP)
old_signal_handler = &old_TSTP;
if (sig == SIGTTOU)
old_signal_handler = &old_TTOU;
if (sig == SIGTTIN)
old_signal_handler = &old_TTIN;
#endif /* SIGTSTP */
#if defined (SIGQUIT)
if (sig == SIGQUIT)
old_signal_handler = &old_QUIT;
#endif /* SIGQUIT */
#if defined (SIGINT)
if (sig == SIGINT)
old_signal_handler = &old_INT;
#endif /* SIGINT */
#if defined (SIGTERM)
if (sig == SIGTERM)
old_signal_handler = &old_TERM;
#endif /* SIGTERM */
/* For stop signals, restore the terminal IO, leave the cursor
at the bottom of the window, and stop us. */
terminal_goto_xy (0, screenheight - 1);
terminal_clear_to_eol ();
fflush (stdout);
terminal_unprep_terminal ();
restore_termsig (sig, old_signal_handler);
UNBLOCK_SIGNAL (sig);
kill (getpid (), sig);
/* The program is returning now. Restore our signal handler,
turn on terminal handling, redraw the screen, and place the
cursor where it belongs. */
terminal_prep_terminal ();
set_termsig (sig, old_signal_handler);
/* window size might be changed while sleeping */
reset_info_window_sizes ();
}
break;
#if defined (SIGWINCH) || defined (SIGUSR1)
#ifdef SIGWINCH
case SIGWINCH:
#endif
#ifdef SIGUSR1
case SIGUSR1:
#endif
{
/* Turn off terminal IO, tell our parent that the window has changed,
then reinitialize the terminal and rebuild our windows. */
#ifdef SIGWINCH
if (sig == SIGWINCH)
old_signal_handler = &old_WINCH;
#endif
#ifdef SIGUSR1
if (sig == SIGUSR1)
old_signal_handler = &old_USR1;
#endif
/* This seems risky: what if we receive a (real) signal before
the next line is reached? */
#if 0
restore_termsig (sig, old_signal_handler);
//.........这里部分代码省略.........