本文整理汇总了C++中sigemptyset函数的典型用法代码示例。如果您正苦于以下问题:C++ sigemptyset函数的具体用法?C++ sigemptyset怎么用?C++ sigemptyset使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了sigemptyset函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: monitor_child
/* This stays around for as long as the initial process in the app does
* and when that exits it exits, propagating the exit status. We do this
* by having pid 1 in the sandbox detect this exit and tell the monitor
* the exit status via a eventfd. We also track the exit of the sandbox
* pid 1 via a signalfd for SIGCHLD, and exit with an error in this case.
* This is to catch e.g. problems during setup. */
static void
monitor_child (int event_fd)
{
int res;
uint64_t val;
ssize_t s;
int signal_fd;
sigset_t mask;
struct pollfd fds[2];
int num_fds;
struct signalfd_siginfo fdsi;
int dont_close[] = { event_fd, -1 };
/* Close all extra fds in the monitoring process.
Any passed in fds have been passed on to the child anyway. */
fdwalk (proc_fd, close_extra_fds, dont_close);
sigemptyset (&mask);
sigaddset (&mask, SIGCHLD);
signal_fd = signalfd (-1, &mask, SFD_CLOEXEC | SFD_NONBLOCK);
if (signal_fd == -1)
die_with_error ("Can't create signalfd");
num_fds = 1;
fds[0].fd = signal_fd;
fds[0].events = POLLIN;
if (event_fd != -1)
{
fds[1].fd = event_fd;
fds[1].events = POLLIN;
num_fds++;
}
while (1)
{
fds[0].revents = fds[1].revents = 0;
res = poll (fds, num_fds, -1);
if (res == -1 && errno != EINTR)
die_with_error ("poll");
/* Always read from the eventfd first, if pid 2 died then pid 1 often
* dies too, and we could race, reporting that first and we'd lose
* the real exit status. */
if (event_fd != -1)
{
s = read (event_fd, &val, 8);
if (s == -1 && errno != EINTR && errno != EAGAIN)
die_with_error ("read eventfd");
else if (s == 8)
exit ((int)val - 1);
}
s = read (signal_fd, &fdsi, sizeof (struct signalfd_siginfo));
if (s == -1 && errno != EINTR && errno != EAGAIN)
die_with_error ("read signalfd");
else if (s == sizeof(struct signalfd_siginfo))
{
if (fdsi.ssi_signo != SIGCHLD)
die ("Read unexpected signal\n");
exit (fdsi.ssi_status);
}
}
}
示例2: audio_write_start
void*
audio_write_start(void *arg)
{
int idle = 1;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int len;
sigset_t sigs;
demux_attr_t *attr;
video_info_t *vi;
signal(SIGURG, sighandler);
sigemptyset(&sigs);
sigaddset(&sigs, SIGURG);
pthread_sigmask(SIG_UNBLOCK, &sigs, NULL);
pthread_mutex_lock(&mutex);
printf("audio write thread started (pid %d)\n", getpid());
pthread_cond_wait(&video_cond, &mutex);
while (1) {
while (seeking || jumping)
pthread_cond_wait(&video_cond, &mutex);
while (!video_playing) {
pcm_decoded = 0;
empty_ac3();
if ( !(idle) ) {
sem_post(&write_threads_idle_sem);
idle = 1;
printf("audio write thread sleeping...\n");
}
pthread_cond_wait(&video_cond, &mutex);
}
if ( idle ) {
sem_wait(&write_threads_idle_sem);
idle = 0;
printf("audio write thread running\n");
}
if (running_replaytv) {
attr = demux_get_attr(handle);
vi = &attr->video.stats.info.video;
if (attr->audio.type != audio_type) {
// JBH: FIX ME: This code never gets hit
audio_type = attr->audio.type;
switch (audio_type) {
case AUDIO_MODE_AC3:
case AUDIO_MODE_PCM:
audio_output = AV_AUDIO_PCM;
printf("switch to PCM audio\n");
break;
default:
av_set_audio_type(audio_type);
audio_output = AV_AUDIO_MPEG;
printf("switch to MPEG audio\n");
break;
}
av_set_audio_output(audio_output);
}
}
switch (audio_type) {
case AUDIO_MODE_MPEG1_PES:
case AUDIO_MODE_MPEG2_PES:
case AUDIO_MODE_ES:
if (jit_mode == 0) {
if ((len=DEMUX_WRITE_AUDIO(handle, fd_audio)) > 0)
pthread_cond_broadcast(&video_cond);
else
pthread_cond_wait(&video_cond, &mutex);
} else {
int flags, duration;
len=DEMUX_JIT_WRITE_AUDIO(handle, fd_audio,
get_cur_vid_stc(),jit_mode,
&flags,&duration);
if(flags & 4)
{
/*4 is the same as 1 followed by 2*/
flags = (flags | 1 | 2) & ~4;
}
if(flags & 1)
{
av_pause_video();
}
if((flags & 2) && !paused)
{
if(duration <= 10)
video_unpause_timer_callback(pause_widget);
else
mvpw_set_timer(pause_widget,
video_unpause_timer_callback, duration);
}
if(flags & 8)
{
usleep(duration*1000);
}
if(len > 0)
//.........这里部分代码省略.........
示例3: main
int main(int argc, char *argv[])
{
struct usb_serial_test *serial;
unsigned size = 0;
uint8_t fixed = 0;
int if_num = 0;
int alt_set = 0;
uint8_t eprx = 0;
uint8_t eptx = 0;
int ret = 0;
unsigned vid = 0;
unsigned pid = 0;
struct sigaction sa;
sa.sa_handler = signal_exit;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction(SIGINT, &sa, NULL) == -1)
printf("failed to handle signal\n");
(void) signal(SIGINT, signal_exit);
while (ARRAY_SIZE(serial_opts)) {
int optidx = 0;
int opt;
opt = getopt_long(argc, argv, "v:p:s:i:a:r:t:dhf", serial_opts, &optidx);
if (opt < 0)
break;
switch (opt) {
case 'v':
vid = strtoul(optarg, NULL, 16);
break;
case 'p':
pid = strtoul(optarg, NULL, 16);
break;
case 'r':
eprx = strtol(optarg,NULL, 16);
break;
case 't':
eptx = strtol(optarg, NULL, 16);
break;
case 'i':
if_num = atoi(optarg);
break;
case 'a':
alt_set = atoi(optarg);
break;
case 's':
size = atoi(optarg);
if (size == 0) {
DBG("%s: can't do it with zero length buffer\n",
__func__);
ret = -EINVAL;
goto err0;
}
break;
case 'f':
fixed = 1;
break;
case 'd':
debug = 1;
break;
case 'h': /* FALLTHROUGH */
default:
usage(argv[0]);
return 1;
}
}
if (!vid || !pid) {
fprintf(stderr, "%s: missing arguments\n"
"Try `%s --help' for more information\n",
argv[0], argv[0]);
return 1;
}
serial = malloc(sizeof(*serial));
if (!serial) {
fprintf(stderr, "%s: unable to allocate memory\n", argv[0]);
ret = -ENOMEM;
goto err0;
}
memset(serial, 0x00, sizeof(*serial));
serial->size = size;
serial->eprx = eprx;
serial->eptx = eptx;
serial->interface_num = if_num;
serial->alt_setting = alt_set;
serial->write_mintput = MIN_TPUT;
serial->read_mintput = MIN_TPUT;
ret = alloc_and_init_buffer(serial);
if (ret < 0) {
fprintf(stderr, "%s: failed to allocate buffers\n", argv[0]);
//.........这里部分代码省略.........
示例4: main
int
main(int argc, char **argv)
{
int ch;
unsigned long i;
int foreground, preserve;
int error, pstat, status;
int killsig = SIGTERM;
pid_t pid, cpid;
double first_kill;
double second_kill;
bool timedout = false;
bool do_second_kill = false;
bool child_done = false;
struct sigaction signals;
struct procctl_reaper_status info;
struct procctl_reaper_kill killemall;
int signums[] = {
-1,
SIGTERM,
SIGINT,
SIGHUP,
SIGCHLD,
SIGALRM,
SIGQUIT,
};
foreground = preserve = 0;
second_kill = 0;
const struct option longopts[] = {
{ "preserve-status", no_argument, &preserve, 1 },
{ "foreground", no_argument, &foreground, 1 },
{ "kill-after", required_argument, NULL, 'k'},
{ "signal", required_argument, NULL, 's'},
{ "help", no_argument, NULL, 'h'},
{ NULL, 0, NULL, 0 }
};
while ((ch = getopt_long(argc, argv, "+k:s:h", longopts, NULL)) != -1) {
switch (ch) {
case 'k':
do_second_kill = true;
second_kill = parse_duration(optarg);
break;
case 's':
killsig = parse_signal(optarg);
break;
case 0:
break;
case 'h':
default:
usage();
break;
}
}
argc -= optind;
argv += optind;
if (argc < 2)
usage();
first_kill = parse_duration(argv[0]);
argc--;
argv++;
if (!foreground) {
/* Aquire a reaper */
if (procctl(P_PID, getpid(), PROC_REAP_ACQUIRE, NULL) == -1)
err(EX_OSERR, "Fail to acquire the reaper");
}
memset(&signals, 0, sizeof(signals));
sigemptyset(&signals.sa_mask);
if (killsig != SIGKILL && killsig != SIGSTOP)
signums[0] = killsig;
for (i = 0; i < sizeof(signums) / sizeof(signums[0]); i ++)
sigaddset(&signals.sa_mask, signums[i]);
signals.sa_handler = sig_handler;
signals.sa_flags = SA_RESTART;
for (i = 0; i < sizeof(signums) / sizeof(signums[0]); i ++)
if (signums[i] != -1 && signums[i] != 0 &&
sigaction(signums[i], &signals, NULL) == -1)
err(EX_OSERR, "sigaction()");
signal(SIGTTIN, SIG_IGN);
signal(SIGTTOU, SIG_IGN);
pid = fork();
if (pid == -1)
err(EX_OSERR, "fork()");
else if (pid == 0) {
/* child process */
signal(SIGTTIN, SIG_DFL);
signal(SIGTTOU, SIG_DFL);
//.........这里部分代码省略.........
示例5: main
int main(int argc, char **argv)
{
int sockfd, new_fd; // listen on sock_fd, new connection on new_fd
struct addrinfo hints, *servinfo, *p;
struct sockaddr_storage their_addr; // connector's address information
socklen_t sin_size;
struct sigaction sa;
int yes=1;
char s[INET6_ADDRSTRLEN];
int rv;
int rtn;
rtn = shared_memory_attach();
mk_daemon(argc,argv);
rtn = shared_memory_attach();
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE; // use my IP
if ((rv = getaddrinfo(NULL, RAS_PORT, &hints, &servinfo)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
return 1;
}
// loop through all the results and bind to the first we can
for(p = servinfo; p != NULL; p = p->ai_next) {
if ((sockfd = socket(p->ai_family, p->ai_socktype,
p->ai_protocol)) == -1) {
perror("server: socket");
continue;
}
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes,
sizeof(int)) == -1) {
perror("setsockopt");
exit(1);
}
if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
close(sockfd);
perror("server: bind");
continue;
}
break;
}
if (p == NULL) {
fprintf(stderr, "server: failed to bind\n");
return 2;
}
freeaddrinfo(servinfo); // all done with this structure
if (listen(sockfd, BACKLOG) == -1) {
perror("listen");
exit(1);
}
sa.sa_handler = sigchld_handler; // reap all dead processes
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction(SIGCHLD, &sa, NULL) == -1) {
perror("sigaction");
exit(1);
}
if (!Daemon) printf("server: waiting for connections on port %s...\n",RAS_PORT);
while(1) { // main accept() loop
sin_size = sizeof their_addr;
new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
if (new_fd == -1) {
perror("accept");
continue;
}
inet_ntop(their_addr.ss_family,
get_in_addr((struct sockaddr *)&their_addr),
s, sizeof s);
if (!Daemon) printf("server: got connection from %s\n", s);
if (!fork()) { // this is the child process
close(sockfd); // child doesn't need the listener
//if (send(new_fd, "Hello, world!\n", 13, 0) == -1)
//perror("send");
//close(new_fd);
Sockfd = new_fd;
rtn = soc_listen(new_fd);
exit(0);
}
close(new_fd); // parent doesn't need this
}
return (0);
}
示例6: main
int main ( int argc, char **argv )
{
extern QueueObject_t *IndexQ;
struct sigaction sa;
sigset_t sigmsk;
uint32 count;
GlobalAbort = false;
/* Parse the command line options */
MainParseArgs( argc, argv );
mainThreadId = pthread_self();
/*
* Setup the sigmasks for this thread (which is the parent to all others).
* This will propogate to all children.
*/
sigfillset( &sigmsk );
sigdelset( &sigmsk, SIGUSR1 );
sigdelset( &sigmsk, SIGUSR2 );
sigdelset( &sigmsk, SIGINT );
sigdelset( &sigmsk, SIGSEGV );
sigdelset( &sigmsk, SIGILL );
sigdelset( &sigmsk, SIGFPE );
pthread_sigmask( SIG_SETMASK, &sigmsk, NULL );
/* Start up the Logging thread */
logging_initialize(FALSE);
thread_register( &mainThreadId, "thread_main", NULL );
/* Setup signal handler for SIGUSR1 (toggles Debug) */
sa.sa_sigaction = (sigAction_t)logging_toggle_debug;
sigemptyset( &sa.sa_mask );
sa.sa_flags = SA_RESTART;
sigaction( SIGUSR1, &sa, NULL );
/* Setup the exit handler */
atexit( MainDelayExit );
/* Setup signal handler for SIGINT (shut down cleanly) */
sa.sa_sigaction = signal_interrupt;
sigemptyset( &sa.sa_mask );
sa.sa_flags = SA_RESTART;
sigaction( SIGINT, &sa, NULL );
/* Setup signal handlers that are to be propogated to all threads */
sa.sa_sigaction = signal_everyone;
sigemptyset( &sa.sa_mask );
sa.sa_flags = SA_RESTART | SA_SIGINFO;
sigaction( SIGUSR2, &sa, NULL );
/* Setup signal handlers for SEGV, ILL, FPE */
sa.sa_sigaction = signal_death;
sigemptyset( &sa.sa_mask );
sa.sa_flags = SA_RESTART | SA_SIGINFO;
sigaction( SIGSEGV, &sa, NULL );
sigaction( SIGILL, &sa, NULL );
sigaction( SIGFPE, &sa, NULL );
/* Print the startup log messages */
LogBanner();
/* Setup the CLucene indexer */
clucene_init(1);
/* Setup the MySQL connection */
db_setup();
db_check_schema_main();
db_rebuild_clucene();
/* Wait for the clucene thread to finish emptying its queue */
while( (count = QueueUsed( IndexQ )) > 0 ) {
LogPrint( LOG_INFO, "%d left", count );
sleep( 1 );
}
GlobalAbort = TRUE;
return(0);
}
示例7: int
//----------------------------------------------------------------------
void Demonizer::startWithMonitoring(int(*startFunc)(void),
int(*stopFunc)(void), int(*rereadCfgFun)(void)) {
this->ms_startFunc = startFunc;
this->ms_stopFunc = stopFunc;
this->ms_rereadCfgFun = rereadCfgFun;
int pid = 0;
int status = 0;
int need_start = 1;
sigset_t sigset;
siginfo_t siginfo;
sigemptyset(&sigset);
sigaddset(&sigset, SIGQUIT);
sigaddset(&sigset, SIGINT);
//sigaddset(&sigset, SIGTERM);
//sigaddset(&sigset, SIGCHLD);
sigaddset(&sigset, SIGCHLD);
sigprocmask(SIG_BLOCK, &sigset, NULL);
for (; ;) {
if (need_start) {
pid = fork();
if (pid != 0) {
sysLogger.log("Fork with pid=" + Logger::itos(pid));
if (SystemTools::checkRunningAndSavePID(getName() + "_worker", pid)) {
sysLogger.log("worker daemon is already running");
exit(CHILD_NEED_TERMINATE);
}
}
}
need_start = 1;
if (pid == -1) {
sysLogger.log("Monitor: fork failed with " + std::string(strerror(errno)));
} else if (!pid) {
//we are child
status = this->workProc();
exit(status);
} else {// parent
sigwaitinfo(&sigset, &siginfo);
sysLogger.log("Monitor: wait status...");
if (siginfo.si_signo == SIGCHLD) {
sysLogger.log("Monitor: got child status...");
wait(&status);
sysLogger.log("Monitor: got exit status");
status = WEXITSTATUS(status);
if (status == CHILD_NEED_TERMINATE) {
sysLogger.log("Monitor: children stopped");
break;
} else if (status == CHILD_NEED_RESTART) {// restart
sysLogger.log("Monitor: children restart");
}
} else if (siginfo.si_signo == SIGUSR1) {//reread config
sysLogger.log("Monitor: resend signal to pid=" + Logger::itos(pid));
kill(pid, SIGUSR1); //resend signal
need_start = 0; //don't restart
} else {
sysLogger.log("Monitor: signal " + std::string(strsignal(siginfo.si_signo)));
//kill child
kill(pid, SIGTERM);
status = 0;
break;
}
}
}
sysLogger.log("Monitor: stopped");
//delete pid file
//unlink(calculateFilenameToStorePID(this->getName()));
}
示例8: MOTION_LOG
static unsigned char *bktr_device_init(struct video_dev *viddev, int width, int height,
unsigned input, unsigned norm, unsigned long freq)
{
int dev_bktr = viddev->fd_device;
struct sigaction act, old;
//int dev_tunner = viddev->fd_tuner;
/* to ensure that all device will be support the capture mode
_TODO_ : Autodected the best capture mode .
*/
int dummy = 1;
// int pixelformat = BSD_VIDFMT_I420;
void *map;
/* If we have choose the tuner is needed to setup the frequency. */
if ((viddev->tuner_device != NULL) && (input == BKTR_IN_TV)) {
if (!freq) {
MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO, "%s: Not valid Frequency [%lu] for "
"Source input [%i]", freq, input);
return NULL;
} else if (bktr_set_freq(viddev, freq) == -1) {
MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "%s: Frequency [%lu] Source input [%i]",
freq, input);
return NULL;
}
}
/* FIXME if we set as input tuner , we need to set option for tuner not for bktr */
if ((dummy = bktr_set_input_device(viddev, input)) == -1) {
MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "%s: set input [%d]", input);
return NULL;
}
viddev->input = dummy;
if ((dummy = bktr_set_input_format(viddev, norm)) == -1) {
MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "%s: set input format [%d]",
norm);
return NULL;
}
viddev->norm = dummy;
if (bktr_set_geometry(viddev, width, height) == -1) {
MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO, "%s: set geometry [%d]x[%d]",
width, height);
return NULL;
}
if (freq) {
MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO, "%s: Frequency set (no implemented yet");
}
/*
* Set capture mode and capture buffers
* That is the buffer size for capture images ,
* so is dependent of color space of input format / FIXME
*/
viddev->v4l_bufsize = (((width * height * 3 / 2)) * sizeof(unsigned char));
viddev->v4l_fmt = VIDEO_PALETTE_YUV420P;
map = mmap((caddr_t)0, viddev->v4l_bufsize, PROT_READ|PROT_WRITE, MAP_SHARED,
dev_bktr, (off_t)0);
if (map == MAP_FAILED) {
MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO, "%s: mmap failed");
return NULL;
}
/* FIXME double buffer */
if (0) {
viddev->v4l_maxbuffer = 2;
viddev->v4l_buffers[0] = map;
viddev->v4l_buffers[1] = (unsigned char *)map + 0; /* 0 is not valid just a test */
//viddev->v4l_buffers[1] = map+vid_buf.offsets[1];
} else {
viddev->v4l_buffers[0] = map;
viddev->v4l_maxbuffer = 1;
}
viddev->v4l_curbuffer = 0;
/* Clear the buffer */
if (ioctl(dev_bktr, BT848SCBUF, &dummy) < 0) {
MOTION_LOG(ERR, TYPE_VIDEO, SHOW_ERRNO, "%s: BT848SCBUF");
return NULL;
}
/* Signal handler to know when data is ready to be read() */
memset(&act, 0, sizeof(act));
sigemptyset(&act.sa_mask);
act.sa_handler = catchsignal;
sigaction(SIGUSR2, &act, &old);
dummy = SIGUSR2;
//viddev->capture_method = METEOR_CAP_CONTINOUS;
//viddev->capture_method = METEOR_CAP_SINGLE;
//.........这里部分代码省略.........
示例9: gfx_ctx_drm_egl_set_video_mode
static bool gfx_ctx_drm_egl_set_video_mode(void *data,
unsigned width, unsigned height,
bool fullscreen)
{
static const EGLint egl_attribs_gl[] = {
DRM_EGL_ATTRIBS_BASE,
EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
EGL_NONE,
};
static const EGLint egl_attribs_gles[] = {
DRM_EGL_ATTRIBS_BASE,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_NONE,
};
#ifdef EGL_KHR_create_context
static const EGLint egl_attribs_gles3[] = {
DRM_EGL_ATTRIBS_BASE,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR,
EGL_NONE,
};
#endif
static const EGLint egl_attribs_vg[] = {
DRM_EGL_ATTRIBS_BASE,
EGL_RENDERABLE_TYPE, EGL_OPENVG_BIT,
EGL_NONE,
};
const EGLint *attrib_ptr;
EGLint major, minor, n, egl_attribs[16], *attr;
float refresh_mod;
int i, ret = 0;
struct sigaction sa = {{0}};
struct drm_fb *fb = NULL;
driver_t *driver = driver_get_ptr();
settings_t *settings = config_get_ptr();
gfx_ctx_drm_egl_data_t *drm = (gfx_ctx_drm_egl_data_t*)
driver->video_context_data;
if (!drm)
return false;
sa.sa_handler = sighandler;
sa.sa_flags = SA_RESTART;
sigemptyset(&sa.sa_mask);
sigaction(SIGINT, &sa, NULL);
sigaction(SIGTERM, &sa, NULL);
switch (g_api)
{
case GFX_CTX_OPENGL_API:
attrib_ptr = egl_attribs_gl;
break;
case GFX_CTX_OPENGL_ES_API:
#ifdef EGL_KHR_create_context
if (g_major >= 3)
attrib_ptr = egl_attribs_gles3;
else
#endif
attrib_ptr = egl_attribs_gles;
break;
case GFX_CTX_OPENVG_API:
attrib_ptr = egl_attribs_vg;
break;
default:
attrib_ptr = NULL;
}
/* If we use black frame insertion,
* we fake a 60 Hz monitor for 120 Hz one, etc, so try to match that. */
refresh_mod = settings->video.black_frame_insertion ? 0.5f : 1.0f;
/* Find desired video mode, and use that.
* If not fullscreen, we get desired windowed size,
* which is not appropriate. */
if ((width == 0 && height == 0) || !fullscreen)
drm->g_drm_mode = &drm->g_connector->modes[0];
else
{
/* Try to match settings->video.refresh_rate as closely as possible.
* Lower resolutions tend to have multiple supported
* refresh rates as well.
*/
float minimum_fps_diff = 0.0f;
/* Find best match. */
for (i = 0; i < drm->g_connector->count_modes; i++)
{
float diff;
if (width != drm->g_connector->modes[i].hdisplay ||
height != drm->g_connector->modes[i].vdisplay)
continue;
diff = fabsf(refresh_mod * drm->g_connector->modes[i].vrefresh
- settings->video.refresh_rate);
if (!drm->g_drm_mode || diff < minimum_fps_diff)
{
//.........这里部分代码省略.........
示例10: daemon_start
/******************************************************************************
* *
* Function: daemon_start *
* *
* Purpose: init process as daemon *
* *
* Parameters: allow_root - allow root permission for application *
* *
* Author: Alexei Vladishev *
* *
* Comments: it doesn't allow running under 'root' if allow_root is zero *
* *
******************************************************************************/
int daemon_start(int allow_root)
{
pid_t pid;
struct passwd *pwd;
struct sigaction phan;
char user[7] = "zabbix";
/* running as root ? */
if (0 == allow_root && (0 == getuid() || 0 == getgid()))
{
pwd = getpwnam(user);
if (NULL == pwd)
{
zbx_error("user %s does not exist", user);
zbx_error("Cannot run as root!");
exit(FAIL);
}
if (-1 == setgid(pwd->pw_gid))
{
zbx_error("cannot setgid to %s: %s", user, zbx_strerror(errno));
exit(FAIL);
}
#ifdef HAVE_FUNCTION_INITGROUPS
if (-1 == initgroups(user, pwd->pw_gid))
{
zbx_error("cannot initgroups to %s: %s", user, zbx_strerror(errno));
exit(FAIL);
}
#endif
if (-1 == setuid(pwd->pw_uid))
{
zbx_error("cannot setuid to %s: %s", user, zbx_strerror(errno));
exit(FAIL);
}
#ifdef HAVE_FUNCTION_SETEUID
if (-1 == setegid(pwd->pw_gid) || -1 == seteuid(pwd->pw_uid))
{
zbx_error("cannot setegid or seteuid to %s: %s", user, zbx_strerror(errno));
exit(FAIL);
}
#endif
}
if (0 != (pid = zbx_fork()))
exit(0);
setsid();
signal(SIGHUP, SIG_IGN);
if (0 != (pid = zbx_fork()))
exit(0);
/* this is to eliminate warning: ignoring return value of chdir */
if (-1 == chdir("/"))
assert(0);
umask(0002);
redirect_std(CONFIG_LOG_FILE);
#ifdef HAVE_SYS_RESOURCE_SETPRIORITY
if (0 != setpriority(PRIO_PROCESS, 0, 5))
zbx_error("Unable to set process priority to 5. Leaving default.");
#endif
/*------------------------------------------------*/
if (FAIL == create_pid_file(CONFIG_PID_FILE))
exit(FAIL);
parent_pid = (int)getpid();
phan.sa_sigaction = child_signal_handler;
sigemptyset(&phan.sa_mask);
phan.sa_flags = SA_SIGINFO;
sigaction(SIGINT, &phan, NULL);
sigaction(SIGQUIT, &phan, NULL);
sigaction(SIGTERM, &phan, NULL);
sigaction(SIGPIPE, &phan, NULL);
sigaction(SIGILL, &phan, NULL);
sigaction(SIGFPE, &phan, NULL);
//.........这里部分代码省略.........
示例11: w_start_listener
//.........这里部分代码省略.........
}
}
getrlimit(RLIMIT_NOFILE, &limit);
#ifndef HAVE_FSEVENTS
if (limit.rlim_cur < 10240) {
w_log(W_LOG_ERR,
"Your file descriptor limit is very low (%" PRIu64 "), "
"please consult the watchman docs on raising the limits\n",
limit.rlim_cur);
}
#endif
}
#endif
proc_pid = (int)getpid();
if (gettimeofday(&tv, NULL) == -1) {
w_log(W_LOG_ERR, "gettimeofday failed: %s\n", strerror(errno));
return false;
}
proc_start_time = (uint64_t)tv.tv_sec;
signal(SIGPIPE, SIG_IGN);
/* allow SIGUSR1 and SIGCHLD to wake up a blocked thread, without restarting
* syscalls */
memset(&sa, 0, sizeof(sa));
sa.sa_handler = wakeme;
sa.sa_flags = 0;
sigaction(SIGUSR1, &sa, NULL);
sigaction(SIGCHLD, &sa, NULL);
// Block SIGCHLD everywhere
sigemptyset(&sigset);
sigaddset(&sigset, SIGCHLD);
sigprocmask(SIG_BLOCK, &sigset, NULL);
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
listener_fd = get_listener_socket(path);
if (listener_fd == -1) {
return false;
}
w_set_cloexec(listener_fd);
if (pthread_create(&reaper_thread, NULL, child_reaper, NULL)) {
w_log(W_LOG_FATAL, "pthread_create(reaper): %s\n",
strerror(errno));
return false;
}
if (!clients) {
clients = w_ht_new(2, &client_hash_funcs);
}
w_state_load();
#ifdef HAVE_LIBGIMLI_H
if (hb) {
gimli_heartbeat_set(hb, GIMLI_HB_RUNNING);
} else {
w_setup_signal_handlers();
}
#else
w_setup_signal_handlers();
示例12: mainloop
//.........这里部分代码省略.........
err(1, "cannot attach event %s: precise mode may not be supported", fds[i].name);
err(1, "cannot attach event %s", fds[i].name);
}
}
/*
* kernel adds the header page to the size of the mmapped region
*/
fds[0].buf = mmap(NULL, map_size, PROT_READ|PROT_WRITE, MAP_SHARED, fds[0].fd, 0);
if (fds[0].buf == MAP_FAILED)
err(1, "cannot mmap buffer");
/* does not include header page */
fds[0].pgmsk = (options.mmap_pages*pgsz)-1;
/*
* send samples for all events to first event's buffer
*/
for (i = 1; i < num_fds; i++) {
if (!fds[i].hw.sample_period)
continue;
ret = ioctl(fds[i].fd, PERF_EVENT_IOC_SET_OUTPUT, fds[0].fd);
if (ret)
err(1, "cannot redirect sampling output");
}
if (num_fds > 1 && fds[0].fd > -1) {
for(i = 0; i < num_fds; i++) {
/*
* read the event identifier using ioctl
* new method replaced the trick with PERF_FORMAT_GROUP + PERF_FORMAT_ID + read()
*/
ret = ioctl(fds[i].fd, PERF_EVENT_IOC_ID, &fds[i].id);
if (ret == -1)
err(1, "cannot read ID");
fprintf(options.output_file,"ID %"PRIu64" %s\n", fds[i].id, fds[i].name);
}
}
pollfds[0].fd = fds[0].fd;
pollfds[0].events = POLLIN;
for(i=0; i < num_fds; i++) {
ret = ioctl(fds[i].fd, PERF_EVENT_IOC_ENABLE, 0);
if (ret)
err(1, "cannot enable event %s\n", fds[i].name);
}
signal(SIGCHLD, cld_handler);
close(go[1]);
if (setjmp(jbuf) == 1)
goto terminate_session;
sigemptyset(&bmask);
sigaddset(&bmask, SIGCHLD);
/*
* core loop
*/
for(;;) {
ret = poll(pollfds, 1, -1);
if (ret < 0 && errno == EINTR)
break;
ovfl_count++;
ret = sigprocmask(SIG_SETMASK, &bmask, NULL);
if (ret)
err(1, "setmask");
process_smpl_buf(&fds[0]);
ret = sigprocmask(SIG_UNBLOCK, &bmask, NULL);
if (ret)
err(1, "unblock");
}
terminate_session:
/*
* cleanup child
*/
wait4(pid, &status, 0, NULL);
for(i=0; i < num_fds; i++)
close(fds[i].fd);
/* check for partial event buffer */
process_smpl_buf(&fds[0]);
munmap(fds[0].buf, map_size);
perf_free_fds(fds, num_fds);
fprintf(options.output_file,
"%"PRIu64" samples collected in %"PRIu64" poll events, %"PRIu64" lost samples\n",
collected_samples,
ovfl_count, lost_samples);
/* free libpfm resources cleanly */
pfm_terminate();
fclose(options.output_file);
return 0;
}
示例13: run_monitored
static void run_monitored(char *executable, int argc, char **argv) {
int pid;
const char *t = getenv("KLEE_REPLAY_TIMEOUT");
if (!t)
t = "10000000";
monitored_timeout = atoi(t);
if (monitored_timeout==0) {
fprintf(stderr, "ERROR: invalid timeout (%s)\n", t);
_exit(1);
}
/* Kill monitored process(es) on SIGINT and SIGTERM */
signal(SIGINT, int_handler);
signal(SIGTERM, int_handler);
signal(SIGALRM, timeout_handler);
pid = fork();
if (pid < 0) {
perror("fork");
_exit(66);
} else if (pid == 0) {
/* This process actually executes the target program.
*
* Create a new process group for pid, and the process tree it may spawn. We
* do this, because later on we might want to kill pid _and_ all processes
* spawned by it and its descendants.
*/
setpgrp();
if (!rootdir) {
execv(executable, argv);
perror("execv");
_exit(66);
}
fprintf(stderr, "rootdir: %s\n", rootdir);
const char *msg;
if ((msg = "chdir", chdir(rootdir) == 0) &&
(msg = "chroot", chroot(rootdir) == 0)) {
msg = "execv";
executable = strip_root_dir(executable, rootdir);
argv[0] = strip_root_dir(argv[0], rootdir);
execv(executable, argv);
}
perror(msg);
_exit(66);
} else {
/* Parent process which monitors the child. */
int res, status;
time_t start = time(0);
sigset_t masked;
sigemptyset(&masked);
sigaddset(&masked, SIGALRM);
monitored_pid = pid;
alarm(monitored_timeout);
do {
res = waitpid(pid, &status, 0);
} while (res < 0 && errno == EINTR);
if (res < 0) {
perror("waitpid");
_exit(66);
}
/* Just in case, kill the process group of pid. Since we called setpgrp()
for pid, this will not kill us, or any of our ancestors */
kill(-pid, SIGKILL);
process_status(status, time(0) - start, 0);
}
}
示例14: main
int
main(int argc, char *argv[])
{
struct sigaction sa;
int fd, events, fnum;
const int NOTIFY_SIG = SIGRTMIN;
char *p;
if (argc < 2 || strcmp(argv[1], "--help") == 0)
usageError(argv[0], NULL);
/* Establish handler for notification signal */
sa.sa_sigaction = handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_SIGINFO; /* So handler gets siginfo_t arg. */
if (sigaction(NOTIFY_SIG, &sa, NULL) == -1)
errExit("sigaction");
for (fnum = 1; fnum < argc; fnum++) {
p = strchr(argv[fnum], ':'); /* Look for optional ':' */
if (p == NULL) { /* Default is all events + multishot */
events = DN_ACCESS | DN_ATTRIB | DN_CREATE | DN_DELETE |
DN_MODIFY | DN_RENAME | DN_MULTISHOT;
} else { /* ':' present, parse event chars */
*p = '\0'; /* Terminates directory component */
events = 0;
for (p++; *p != '\0'; p++) {
switch (*p) {
case 'a': events |= DN_ACCESS; break;
case 'A': events |= DN_ATTRIB; break;
case 'c': events |= DN_CREATE; break;
case 'd': events |= DN_DELETE; break;
case 'm': events |= DN_MODIFY; break;
case 'r': events |= DN_RENAME; break;
case 'M': events |= DN_MULTISHOT; break;
default: usageError(argv[0], "Bad event character\n");
}
}
}
/* Obtain a file descriptor for the directory to be monitored */
fd = open(argv[fnum], O_RDONLY);
if (fd == -1)
errExit("open");
printf("opened '%s' as file descriptor %d\n", argv[fnum], fd);
/* Use alternate signal instead of SIGIO for dnotify events */
if (fcntl(fd, F_SETSIG, NOTIFY_SIG) == -1)
errExit("fcntl - F_SETSIG");
/* Enable directory change notifications */
if (fcntl(fd, F_NOTIFY, events) == -1)
errExit("fcntl-F_NOTIFY");
printf("events: %o\n", (unsigned int) events);
}
for (;;)
pause(); /* Wait for events */
}
示例15: main
int
main(int argc, char **argv)
{ /*Main program */
int cellNum; /*Cell entry number */
int rc; /*Return value from U_CellGetLocalTokens */
time_t current_time; /*Current time of day */
time_t tokenExpireTime; /*When token expires */
char *expireString; /*Char string of expiration time */
char UserName[MAXKTCNAMELEN * 2 + 2]; /*Printable user name */
char *cellName;
struct ktc_principal clientName; /* service name for ticket */
struct ktc_token token; /* the token we're printing */
struct ktc_setTokenData *tokenSet;
#ifdef AFS_AIX32_ENV
/*
* The following signal action for AIX is necessary so that in case of a
* crash (i.e. core is generated) we can include the user's data section
* in the core dump. Unfortunately, by default, only a partial core is
* generated which, in many cases, isn't too useful.
*/
struct sigaction nsa;
sigemptyset(&nsa.sa_mask);
nsa.sa_handler = SIG_DFL;
nsa.sa_flags = SA_FULLDUMP;
sigaction(SIGSEGV, &nsa, NULL);
#endif
/* has no args ... support for help flag */
if (argc > 1) {
/* syntax from AFS Com Ref Man p9-39 */
printf("Usage: tokens [-help]\n");
fflush(stdout);
exit(0);
}
printf("\nTokens held by the Cache Manager:\n\n");
cellNum = 0;
current_time = time(0);
while (1) {
rc = ktc_ListTokensEx(cellNum, &cellNum, &cellName);
if (rc) {
/* only error is now end of list */
printf(" --End of list--\n");
break;
} else {
/* get the ticket info itself */
rc = ktc_GetTokenEx(cellName, &tokenSet);
if (rc) {
printf
("tokens: failed to get token info for cell %s (code %d)\n",
cellName, rc);
continue;
}
rc = token_extractRxkad(tokenSet, &token, NULL, &clientName);
if (rc == 0) {
tokenExpireTime = token.endTime;
strcpy(UserName, clientName.name);
if (clientName.instance[0] != 0) {
strcat(UserName, ".");
strcat(UserName, clientName.instance);
}
if (UserName[0] == 0)
printf("rxkad Tokens");
else if (strncmp(UserName, "AFS ID", 6) == 0) {
printf("User's (%s) rxkad tokens", UserName);
} else if (strncmp(UserName, "Unix UID", 8) == 0) {
printf("RxkadTokens");
} else
printf("User %s's rxkad tokens", UserName);
printf(" for %s ", cellName);
if (tokenExpireTime <= current_time)
printf("[>> Expired <<]\n");
else {
expireString = ctime(&tokenExpireTime);
expireString += 4; /*Move past the day of week */
expireString[12] = '\0';
printf("[Expires %s]\n", expireString);
}
}
token_FreeSet(&tokenSet);
}
}
exit(0);
} /*Main program */