fork() . , . , (, ). , , , stopOnSignal kill() . , kill() , getppid().
, ( exec() 10.01.2014):
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <bits/signum.h>
static bool stopOnSignal = false;
uint32_t clockedMilliseconds(clock_t t1, clock_t t2)
{
if (t2 > t1) { return (t2 - t1) / (CLOCKS_PER_SEC/1000); }
else
{ return t2 / (CLOCKS_PER_SEC/1000); }
}
void signalHandler(int signum)
{
printf("Caught signal %d\n",signum);
stopOnSignal = true;
}
int main (int argc, char *argv[])
{
pid_t cpid;
char * mstr;
int rc = -999999;
int krc = 0;
uint32_t timeoutWait = 10000 ;
int count = 0;
int loops = 0;
signal(SIGUSR1, signalHandler);
if (argc < 2) {
printf("usage: ./sigparent sleep-milliseconds [timeout-milliseconds]");
exit -1;
}
cpid = fork();
if (cpid == -1) {
printf("%d : failed to start child process.\n", errno);
perror("fork");
exit(-1);
}
if (cpid == 0) {
execl("sleeping_child", argv[1],(char *) NULL);
}
else {
if (argc > 2) sscanf(argv[2],"%d",&timeoutWait);
clock_t t1 = clock();
clock_t t2;
do {
if (count < 100000) count++;
else {
loops++;
printf("loops of 100000 duration = %d \n", loops);
count = 0;
}
t2 = clock();
if ( clockedMilliseconds(t1, t2) > timeoutWait) {
krc = kill(cpid,9);
rc = 3;
break;
}
if ( stopOnSignal == true ) {
rc = 0;
break;
}
} while (true);
if (rc == -999999) {
printf("process failed horribly!\n");
}
else if (rc == 3) {
if (krc == 0){
printf("TIMEOUT, waiting %d ms on pid %d\n",
timeoutWait, cpid);
}
else {
printf("%d : attempted TIMEOUT failed.\n", errno);
perror("kill");
}
}
else {
printf("child process ended normally.\n");
}
}
exit(0);
}
, - . - sigparent.c. sleep_child.c.
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char * argv[]) {
int rc = 0;
int millis;
if (argc > 2) sscanf(argv[2],"%d",&millis);
else millis = 2000;
rc = usleep(millis * 1000);
printf("slept for %d milliseconds\n",millis);
printf("parent is %d \n", getppid());
kill(getppid(),SIGUSR1);
return(rc);
}
sleep_child , bash. , :
gcc -o sleeping_child sleeping_child.c
gcc -o sigparent sigparent.c
./sigparent 1000 3000
./sigparent 10000 3000
Duck . , , . , waitpid().. , .