/*- * Copyright (c)2010 Takehiko NOZAKI, * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include #include #include #include static int running; static pthread_t thread; static pthread_mutex_t mutex; static pthread_cond_t cond; static void *timer(void *); static void init_timer(void); static void start_timer(void); static void stop_timer(void); static void * timer(void *arg) { struct timeval now; struct timespec timeout; pthread_mutex_lock(&mutex); pthread_cond_signal(&cond); do { printf("zzz...\n"); gettimeofday(&now, NULL); timeout.tv_sec = now.tv_sec + 1; timeout.tv_nsec = now.tv_usec * 1000; pthread_cond_timedwait(&cond, &mutex, &timeout); } while (running); pthread_mutex_unlock(&mutex); return NULL; } static void init_timer(void) { running = 0; pthread_mutex_init(&mutex, NULL); pthread_cond_init(&cond, NULL); } static void start_timer(void) { pthread_mutex_lock(&mutex); running = 1; if (pthread_create(&thread, NULL, &timer, NULL) == 0) pthread_cond_wait(&cond, &mutex); pthread_mutex_unlock(&mutex); } void stop_timer() { pthread_mutex_lock(&mutex); running = 0; pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex); pthread_join(thread, NULL); } int main(void) { int pid; pthread_atfork(&stop_timer, &start_timer, &init_timer); init_timer(); start_timer(); pid = fork(); if (pid < 0) abort(); if (pid == 0) { /* child process */ } else { /* parent process */ } }