12 #define ERR_WRONGARGS -1
15 #define ERR_WAITPID -4
20 void printUsage(FILE* out
, int argc
, char** argv
)
22 fprintf(out
, "Run command <command> for at least a specific time. Kill\n");
23 fprintf(out
, "process executing <command> if time is over. \n");
25 fprintf(out
, "Usage: %s [options] <command>\n", argv
[0]);
27 fprintf(out
, "Options:\n");
28 fprintf(out
, " -h Print this help.\n");
29 fprintf(out
, " -t <sec> Number of seconds.\n");
30 fprintf(out
, " -v Be verbose.\n");
34 int main(int argc
, char** argv
)
38 bool argVerbose
=false;
44 printUsage(stderr
, argc
, argv
);
49 //Get the argument index of the head of <command>
52 //Aha, argument -- skip it
53 while( fiarg
<argc
&& strncmp(argv
[fiarg
], "-", 1)==0 )
56 if( strncmp(argv
[fiarg
], "-h", 2) == 0 )
62 else if( strncmp(argv
[fiarg
], "-t", 2) == 0 )
64 //Time is given -- goto next argument
69 fprintf(stderr
, "Missing time.\n");
70 fprintf(stderr
, "\n");
71 printUsage(stderr
, argc
, argv
);
75 //Convert the time given in seconds to float
77 maxtime
= strtof( argv
[fiarg
], &endptr
);
78 if( endptr
!= argv
[fiarg
] + strlen(argv
[fiarg
]) ||
81 fprintf(stderr
, "Invalid time.\n");
82 fprintf(stderr
, "\n");
83 printUsage(stderr
, argc
, argv
);
89 else if( strncmp(argv
[fiarg
], "-v", 2) == 0 )
98 fprintf(stderr
, "Invalid argument: %s\n", argv
[fiarg
]);
99 fprintf(stderr
, "\n");
100 printUsage(stderr
, argc
, argv
);
101 return ERR_WRONGARGS
;
112 printUsage(stdout
, argc
, argv
);
120 fprintf(stderr
, "No time given!\n");
121 fprintf(stderr
, "\n");
122 printUsage(stderr
, argc
, argv
);
123 return ERR_WRONGARGS
;
129 fprintf(stderr
, "No command given!\n");
130 fprintf(stderr
, "\n");
131 printUsage(stderr
, argc
, argv
);
132 return ERR_WRONGARGS
;
144 char** newargv
= (char**) malloc( sizeof(char*)*(argc
-fiarg
+1) );
145 char* newenv
[] = {NULL
};
148 for( int i
=fiarg
; i
<argc
; i
++)
150 newargv
[i
-fiarg
] = (char*)malloc(strlen(argv
[i
])+1);
151 strcpy(newargv
[i
-fiarg
], argv
[i
]);
153 newargv
[argc
-fiarg
] = NULL
;
156 //Execute child process
157 execve(newargv
[0], newargv
, newenv
);
172 //Nmb of loops=seconds
174 //Status flags of child process
180 if( loops
>= maxtime
)
183 printf("Kill child...\n");
185 if( kill(pid
, SIGTERM
) < 0)
194 if( waitpid(-1, &status
, WNOHANG
| WUNTRACED
| WCONTINUED
) < 0 )
197 }while( !WIFEXITED(status
) );
202 printf("Finished\n");