Last active
June 25, 2020 12:42
-
-
Save felixge/bf6cff7fca465b0e559259b65c8bb407 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Example program showing that signal delivery from setitimer ends up in | |
// "random" threads of the executing program. | |
#include <sys/time.h> | |
#include <unistd.h> | |
#include <signal.h> | |
#include <pthread.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
void sighandler(int); | |
void thread_loop(); | |
int main(int argc, char *argv[]) { | |
// Setup SIGPROF handler | |
if (signal(SIGPROF, sighandler) == SIG_ERR) { | |
perror("Unable to install sighandler"); | |
exit(1); | |
} | |
// Spawn a thread | |
pthread_t thread; | |
if(pthread_create(&thread, NULL, (void *)thread_loop, NULL)) { | |
perror("Unable to create thread"); | |
return 1; | |
} | |
// Setup itimer to fire every 1s | |
struct itimerval it_val; | |
it_val.it_value.tv_sec = 1; | |
it_val.it_value.tv_usec = 0; | |
it_val.it_interval = it_val.it_value; | |
if (setitimer(ITIMER_PROF, &it_val, NULL) == -1) { | |
perror("error calling setitimer()"); | |
exit(1); | |
} | |
pthread_t tid = pthread_self(); | |
printf("hello from main: %ld\n", tid); | |
while (1) {} | |
} | |
void thread_loop() { | |
pthread_t tid = pthread_self(); | |
printf("hello from thread: %ld\n", tid); | |
while (1) {} | |
} | |
void sighandler(int signo) { | |
struct timeval t; | |
gettimeofday(&t, NULL); | |
pthread_t tid = pthread_self(); | |
printf("%ld.%ld received signal: %d in thread: %ld\n", t.tv_sec, t.tv_usec, signo, tid); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ gcc -o main-linux main-linux.c -lpthread && ./main-linux | |
hello from main: 140078699435840 | |
hello from thread: 140078699431680 | |
1593088870.606221 received signal: 27 in thread: 140078699435840 | |
1593088871.106247 received signal: 27 in thread: 140078699435840 | |
1593088871.606259 received signal: 27 in thread: 140078699435840 | |
1593088872.106086 received signal: 27 in thread: 140078699431680 | |
1593088872.607236 received signal: 27 in thread: 140078699435840 | |
1593088873.107239 received signal: 27 in thread: 140078699435840 | |
1593088873.607236 received signal: 27 in thread: 140078699435840 | |
1593088874.107203 received signal: 27 in thread: 140078699435840 | |
1593088874.607278 received signal: 27 in thread: 140078699435840 | |
1593088875.107090 received signal: 27 in thread: 140078699435840 | |
1593088875.607041 received signal: 27 in thread: 140078699435840 | |
1593088876.107234 received signal: 27 in thread: 140078699431680 | |
1593088876.574450 received signal: 27 in thread: 140078699431680 | |
1593088877.74682 received signal: 27 in thread: 140078699435840 | |
1593088877.574719 received signal: 27 in thread: 140078699435840 | |
1593088878.76611 received signal: 27 in thread: 140078699435840 | |
1593088878.577650 received signal: 27 in thread: 140078699435840 | |
1593088879.77635 received signal: 27 in thread: 140078699435840 | |
1593088879.577668 received signal: 27 in thread: 140078699435840 | |
1593088880.77569 received signal: 27 in thread: 140078699435840 | |
1593088880.578492 received signal: 27 in thread: 140078699435840 | |
1593088881.79661 received signal: 27 in thread: 140078699435840 | |
1593088881.579681 received signal: 27 in thread: 140078699435840 | |
1593088882.79661 received signal: 27 in thread: 140078699435840 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment