1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
// This is MinGW Program
#include <stdio.h>
#include <windows.h>
#include <sys/stat.h>
BOOL is_process_alive(HANDLE handle) {
DWORD result;
return GetExitCodeProcess(handle, &result) && result == STILL_ACTIVE;
}
BOOL is_file(const char* filename) {
struct stat st;
if (stat(filename, &st) == 0 && S_ISREG(st.st_mode)) return TRUE;
return FALSE;
}
int main(int argc, char** argv) {
const char* winpid = argv[1];
const char* filename = argv[2];
int ppid = atoi(winpid);
if (!ppid) {
fprintf(stderr, "invalid process ID '%s'\n", winpid);
return 1;
}
HANDLE parent_process = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, ppid);
if (parent_process == NULL) {
fprintf(stderr, "failed to open the parent process '%s'\n", winpid);
return 1;
}
int exit_code = 0;
BOOL terminate = FALSE;
while (!terminate) {
FILE* f = fopen(filename, "r");
if (!f) {
fprintf(stderr, "failed to open the file '%s'\n", filename);
terminate = TRUE;
exit_code = 1;
break;
}
unlink(filename);
for (;;) {
if (!is_process_alive(parent_process)) {
terminate = TRUE;
break;
}
if (is_file(filename)) break; // reopen
int count = 0;
char buff[4096];
while (count = fread(&buff, 1, sizeof buff, f))
fwrite(buff, 1, count, stdout);
fflush(stdout);
Sleep(20);
}
fclose(f);
}
CloseHandle(parent_process);
return exit_code;
}
|