source: icGREP/icgrep-devel/icgrep/combine/icgrep-test/process.h @ 5825

Last change on this file since 5825 was 5825, checked in by faldebey, 12 months ago

Update to CoRE testing system

File size: 2.1 KB
Line 
1#ifndef PROCESS_H
2#define PROCESS_H
3
4#include "process.h"
5#include <unistd.h>
6#include <signal.h>
7#include <stdio.h>
8#include <stdlib.h>
9#include <string>
10#include <iostream>
11#include <sys/types.h>
12#include <sys/wait.h>
13#include <fcntl.h>
14#include <unistd.h>
15
16#define TIME_LIMIT 10   //determine time limit in sec
17
18int timeout = 0;
19int child_done = 0;
20int errNum = 0;
21
22void child_handler(int sig)
23{
24    child_done = 1;
25}
26
27void alarm_handler(int sig)
28{
29    timeout = 1;
30}
31
32void segfault_handler(int sig){
33        errNum = sig;
34}
35
36int run_test(vector<string> stringArgs, string fileName) {
37          timeout = 0;
38    child_done = 0;
39    errNum = 0;
40    int fd;
41
42        pid_t pid = fork();
43    if (pid == -1) {
44        perror("fork failed");
45        exit(1);
46    }
47    else if (pid == 0) {
48        signal(SIGSEGV, segfault_handler);
49
50        const char **argv = new const char* [stringArgs.size()+1];
51            for (int i = 0;  i < stringArgs.size();  ++i) {
52                argv [i] = stringArgs[i] .c_str();
53        cout << stringArgs[i] << " ";
54            }
55      cout << endl;
56     
57            argv[stringArgs.size()] = (char*)NULL;
58
59      if ((fd = open(fileName.c_str(), O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR)) == -1){
60                             fprintf(stderr, "Cannot open %s. Try again later.\n", fileName.c_str());
61                  }
62      // redirect stdout
63      dup2(fd, 1);
64      dup2(fd, 2);
65      close(fd);
66
67      execv(argv[0], (char**)argv);
68      cout << endl;
69      exit(0);
70    }
71    else {
72
73      // set up the signal handlers after forking so the child doesn't inherit them
74      signal(SIGSEGV, SIG_DFL);
75      signal(SIGALRM, alarm_handler);
76      signal(SIGCHLD, child_handler);
77
78      alarm(TIME_LIMIT);  // install an alarm to be fired after TIME_LIMIT
79      pause();
80      if (timeout) {
81          printf("alarm triggered\n");
82          printf("killing child\n");
83          kill(pid, SIGKILL);
84          wait(NULL);
85          errNum = -1;
86          // } else {
87          //     printf("alarm triggered, but child finished normally\n");
88          // }
89      }
90      else if (child_done) {
91          printf("child finished normally\n");
92          wait(NULL);
93      }
94    }
95
96        return errNum;
97
98}
99
100#endif // STRINGGEN_H
Note: See TracBrowser for help on using the repository browser.