コード例 #1
0
ファイル: judge.c プロジェクト: PiraHzq/pjudge
void trace_submit(int pid, int *status, int *usedtime, int *usedmem, int timelimit, int casetimelimit, int memlimit, int language, int spj)
{
    int pstat, sig, ecode;
    struct user_regs_struct regs;
    struct rusage usage;
    int tmpmem, tmptime, sub=0;
    while(1)
    {
        wait4(pid, &pstat, 0, &usage);
        if(language==LANG_JAVA)tmpmem=(usage.ru_minflt*getpagesize())>>10;
        else tmpmem=get_proc_status(pid, "VmPeak:");
        if(tmpmem>*usedmem)*usedmem=tmpmem;
        if(get_file_size("error.out"))
        {
            *status=JG_RE;
            ptrace(PTRACE_KILL, pid, NULL, NULL);
            break;
        }
        if(!spj&&get_file_size("user.out")>get_file_size("data.out")*2+1024)
        {
            *status=JG_OL;
            ptrace(PTRACE_KILL, pid, NULL, NULL);
            break;
        }
        if(WIFEXITED(pstat))break;
        ecode=WEXITSTATUS(pstat);
        if(ecode==0x05||ecode==0);
        else
        {
            if(*status==JG_AC)
            {
                switch(ecode)
                {
                    case SIGCHLD:
                    case SIGALRM:
                        alarm(0);
                    case SIGKILL:
                    case SIGXCPU:
                        *status=JG_TL;
                        break;
                    case SIGXFSZ:
                        *status=JG_OL;
                        break;
                    default:
                        *status=JG_RE;
                }
                print_runtime_error(strsignal(ecode));
            }
            ptrace(PTRACE_KILL, pid, NULL, NULL);
            break;
        }
        if(WIFSIGNALED(pstat))
        {
            sig=WTERMSIG(pstat);
            if(*status==JG_AC)
            {
                switch(sig)
                {
                    case SIGCHLD:
                    case SIGALRM:
                        alarm(0);
                    case SIGKILL:
                    case SIGXCPU:
                        *status=JG_TL;
                        break;
                    case SIGXFSZ:
                        *status=JG_OL;
                        break;
                    default:
                        *status=JG_RE;
                }
                print_runtime_error(strsignal(sig));
            }
            break;
        }
        ptrace(PTRACE_GETREGS, pid, NULL, &regs);
        if(oksyscall[regs.REG_SYSCALL]==0)
        {
            *status=JG_RE;
            char msg[MAXLINE+1];
            sprintf(msg, "does not allow syscall id:%d name:%s", (int)regs.REG_SYSCALL, syscallname[regs.REG_SYSCALL]);
            print_runtime_error(msg);
            ptrace(PTRACE_KILL, pid, NULL, NULL);
            break;
        }
        else if(sub==1&&oksyscall[regs.REG_SYSCALL]>0)
            --oksyscall[regs.REG_SYSCALL];
        sub=1-sub;
        ptrace(PTRACE_SYSCALL, pid, NULL, NULL);
    }
コード例 #2
0
/*
 * Description: Executes the second transition
 * Input:		1. Input file handle
 * 				2. Name of input file
 * 				3. Code length in memory word
 * 				4. Data length in memory word
 */
void second_transition_execute(FILE* pFile, char* file_name_without_extension, unsigned int previous_transition_ic, unsigned int previous_transition_dc) {
    compiler_output_files output_files;
    int line_number = 0;

    /* Creates transition first data */
    transition_data* transition = create_transition_data();

    if (transition == NULL) {
        return;
    }

    /* Create ob file */
    output_files.ob_file = create_output_file(file_name_without_extension, CODE_FILE_EXT);

    if (output_files.ob_file == NULL) {
        return;
    }

    output_files.entry_file = NULL;
    output_files.extern_file = NULL;

    /* Write first line to ob file */
    write_code_and_data_size_to_output_file(previous_transition_ic, previous_transition_dc, output_files.ob_file);

    /* Step 1 - Initializes IC to zero*/
    transition->IC = 0;

    /* Reads all code lines */
    while (!feof(pFile) && !transition->is_runtimer_error) {
        char line[MAX_LINE_LENGTH];

        line_number++;

        /* Step 2 - Read next line*/
        if (fgets(line, MAX_LINE_LENGTH + 1, pFile)) {
            /* This isn't an empty line or a comment */
            if (!is_empty_or_comment(line)) {
                transition->current_line_information =
                    create_line_info(file_name_without_extension, line_number, line);

                /* Process line */
                if (transition->current_line_information != NULL) {
                    second_transition_process_line(transition, &output_files);

                    free(transition->current_line_information);
                } else {
                    transition->is_runtimer_error = true;
                }
            }
        }
    }

    /* No error has occurred */
    if (!transition->is_runtimer_error && !transition->is_compiler_error) {
        /* Write data initialization section into ob file */
        write_data_to_output_file(output_files.ob_file);

        /* Close files */
        if (output_files.ob_file != NULL) {
            fclose(output_files.ob_file);
        }

        if (output_files.extern_file != NULL) {
            fclose(output_files.extern_file);
        }

        if (output_files.entry_file != NULL) {
            fclose(output_files.entry_file);
        }
    } else {
        /* Close and delete file */
        if (output_files.ob_file != NULL) {
            char* full_name = allocate_string(strlen(file_name_without_extension) + strlen(CODE_FILE_EXT));

            fclose(output_files.ob_file);
            if (full_name != NULL) {
                strcpy(full_name, file_name_without_extension);
                strcat(full_name, CODE_FILE_EXT);

                remove(full_name);

                free(full_name);
            } else {
                print_runtime_error("Couldn't delete compilation files");
            }

        }

        /* Close and delete file */
        if (output_files.extern_file != NULL) {
            char* full_name = allocate_string(strlen(file_name_without_extension) + strlen(EXTERN_FILE_EXT));

            fclose(output_files.extern_file);

            if (full_name != NULL) {
                strcpy(full_name, file_name_without_extension);
                strcat(full_name, EXTERN_FILE_EXT);

                remove(full_name);

                free(full_name);
            } else {
                print_runtime_error("Couldn't delete compilation files");
            }
        }

        /* Close and delete file */
        if (output_files.entry_file != NULL) {
            char* full_name = allocate_string(strlen(file_name_without_extension) + strlen(ENTRY_FILE_EXT));

            fclose(output_files.entry_file);
            if (full_name != NULL) {
                strcpy(full_name, file_name_without_extension);
                strcat(full_name, ENTRY_FILE_EXT);

                remove(full_name);
                free(full_name);
            } else {
                print_runtime_error("Couldn't delete compilation files");
            }
        }
    }
}