mirror of
https://github.com/clearlinux/graphene.git
synced 2026-09-06 13:51:28 +00:00
100 lines
2.1 KiB
C
100 lines
2.1 KiB
C
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
#include <sys/wait.h>
|
|
#include <signal.h>
|
|
#include <sys/time.h>
|
|
|
|
int firstpid;
|
|
int secondpid;
|
|
|
|
#define NTRIES 10000
|
|
|
|
int count = 0;
|
|
|
|
void sighand1 (int signum, siginfo_t * sinfo, void * ucontext)
|
|
{
|
|
count++;
|
|
printf("firstpid receive a SIGUSR from %d (count = %d)\n",
|
|
sinfo->si_pid, count);
|
|
kill(secondpid, SIGUSR1);
|
|
}
|
|
|
|
void sighand2 (int signum, siginfo_t * sinfo, void * ucontext)
|
|
{
|
|
count++;
|
|
printf("secondpid receive a SIGUSR from %d (count = %d)\n",
|
|
sinfo->si_pid, count);
|
|
kill(firstpid, SIGUSR1);
|
|
}
|
|
|
|
int main(int argc, char ** argv)
|
|
{
|
|
int pipes[2];
|
|
|
|
pipe(pipes);
|
|
|
|
firstpid = fork();
|
|
|
|
if (firstpid < 0) {
|
|
printf("fork failed\n");
|
|
return -1;
|
|
}
|
|
|
|
if (firstpid == 0) {
|
|
close(pipes[1]);
|
|
|
|
struct timeval start_time;
|
|
gettimeofday(&start_time, NULL);
|
|
|
|
signal(SIGUSR1, (void *) sighand1);
|
|
read(pipes[0], &secondpid, sizeof(int));
|
|
kill(secondpid, SIGUSR1);
|
|
while (count < NTRIES - 1)
|
|
sleep(1);
|
|
|
|
struct timeval finish_time;
|
|
gettimeofday(&finish_time, NULL);
|
|
|
|
printf("time spent: %lu microsecond\n",
|
|
(finish_time.tv_sec * 1000000L + finish_time.tv_usec)
|
|
- (start_time.tv_sec * 1000000L + start_time.tv_usec));
|
|
|
|
return 0;
|
|
}
|
|
|
|
close(pipes[0]);
|
|
|
|
secondpid = fork();
|
|
|
|
if (secondpid < 0) {
|
|
printf("fork failed\n");
|
|
return -1;
|
|
}
|
|
|
|
if (secondpid == 0) {
|
|
struct timeval start_time;
|
|
gettimeofday(&start_time, NULL);
|
|
|
|
signal(SIGUSR1, (void *) sighand2);
|
|
secondpid = getpid();
|
|
write(pipes[1], &secondpid, sizeof(int));
|
|
while (count < NTRIES)
|
|
sleep(1);
|
|
|
|
struct timeval finish_time;
|
|
gettimeofday(&finish_time, NULL);
|
|
|
|
printf("time spent: %lu microsecond\n",
|
|
(finish_time.tv_sec * 1000000L + finish_time.tv_usec)
|
|
- (start_time.tv_sec * 1000000L + start_time.tv_usec));
|
|
|
|
return 0;
|
|
}
|
|
|
|
waitpid(-1, NULL, 0);
|
|
waitpid(-1, NULL, 0);
|
|
|
|
return 0;
|
|
}
|