写一个服务的主函数

定义全局变量

#define SVCNAME TEXT("SvcName")

SERVICE_STATUS          gSvcStatus; 
SERVICE_STATUS_HANDLE   gSvcStatusHandle; 
HANDLE                  ghSvcStopEvent = NULL;

服务主函数

VOID WINAPI SvcMain( DWORD dwArgc, LPTSTR *lpszArgv )
{
    // 注册服务控制回调函数

    gSvcStatusHandle = RegisterServiceCtrlHandler( 
        SVCNAME, 
        SvcCtrlHandler);

    if( !gSvcStatusHandle )
    { 
        SvcReportEvent(TEXT("RegisterServiceCtrlHandler")); 
        return; 
    } 

    // 设置服务类型

    gSvcStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; 
    gSvcStatus.dwServiceSpecificExitCode = 0;    

    // 向SCM汇报服务状态,正在初始化

    ReportSvcStatus( SERVICE_START_PENDING, NO_ERROR, 3000 );

    // 执行服务相关的初始化工作

    SvcInit( dwArgc, lpszArgv );
}

初始化


VOID SvcInit( DWORD dwArgc, LPTSTR *lpszArgv)
{
    // 创建一个手动事件,当收到信号时,服务退出。
    ghSvcStopEvent = CreateEvent(
                         NULL,    // default security attributes
                         TRUE,    // manual reset event
                         FALSE,   // not signaled
                         NULL);   // no name

    if ( ghSvcStopEvent == NULL)
    {
        ReportSvcStatus( SERVICE_STOPPED, NO_ERROR, 0 );
        return;
    }

    // 初始化完成后,汇报状态。

    ReportSvcStatus( SERVICE_RUNNING, NO_ERROR, 0 );

    // 执行服务的所有逻辑,直到收到服务停止的信号。

    while(1)
    {
        WaitForSingleObject(ghSvcStopEvent, INFINITE);
	
	//汇报服务停止的状态。

        ReportSvcStatus( SERVICE_STOPPED, NO_ERROR, 0 );
        return;
    }
}

汇报服务状态


VOID ReportSvcStatus( DWORD dwCurrentState,
                      DWORD dwWin32ExitCode,
                      DWORD dwWaitHint)
{
    static DWORD dwCheckPoint = 1;

    // Fill in the SERVICE_STATUS structure.

    gSvcStatus.dwCurrentState = dwCurrentState;
    gSvcStatus.dwWin32ExitCode = dwWin32ExitCode;
    gSvcStatus.dwWaitHint = dwWaitHint;

    if (dwCurrentState == SERVICE_START_PENDING)
        gSvcStatus.dwControlsAccepted = 0;
    else gSvcStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;

    if ( (dwCurrentState == SERVICE_RUNNING) ||
           (dwCurrentState == SERVICE_STOPPED) )
        gSvcStatus.dwCheckPoint = 0;
    else gSvcStatus.dwCheckPoint = dwCheckPoint++;

    // 将服务的状态汇报给SCM
    SetServiceStatus( gSvcStatusHandle, &gSvcStatus );
}

服务控制程序


VOID WINAPI SvcCtrlHandler( DWORD dwCtrl )
{
   // 处理服务控制的请求

   switch(dwCtrl) 
   {  
      case SERVICE_CONTROL_STOP: 
         ReportSvcStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);

         // 请求停止服务

         SetEvent(ghSvcStopEvent);
         ReportSvcStatus(gSvcStatus.dwCurrentState, NO_ERROR, 0);
         
         return;
 
      case SERVICE_CONTROL_INTERROGATE: 
         break; 
 
      default: 
         break;
   } 
   
}

### C语言实现先来先服务(FCFS)调度算法,主函数用户自定义输入 以下是一个完整的 C 语言程序,实现了先来先服务(FCFS)调度算法,并允许用户在主函数中自定义输入进程的到达时间和执行时间[^1]。 #### 示例代码:支持用户自定义输入的 FCFS 调度程序 ```c #include <stdio.h> #include <stdlib.h> // 定义进程结构体 typedef struct { int process_id; // 进程ID int arrival_time; // 到达时间 int burst_time; // 执行时间 int completion_time; // 完成时间 int waiting_time; // 等待时间 int turnaround_time; // 周转时间 } Process; // 比较函数:按到达时间排序 int compare(const void *a, const void *b) { return ((Process *)a)->arrival_time - ((Process *)b)->arrival_time; } // 计算等待时间和周转时间 void calculate_times(Process *processes, int n) { processes[0].completion_time = processes[0].arrival_time + processes[0].burst_time; processes[0].turnaround_time = processes[0].completion_time - processes[0].arrival_time; processes[0].waiting_time = processes[0].turnaround_time - processes[0].burst_time; for (int i = 1; i < n; i++) { processes[i].completion_time = processes[i - 1].completion_time + processes[i].burst_time; processes[i].turnaround_time = processes[i].completion_time - processes[i].arrival_time; processes[i].waiting_time = processes[i].turnaround_time - processes[i].burst_time; } } // 显示结果 void display_results(Process *processes, int n) { int total_waiting_time = 0, total_turnaround_time = 0; printf("Process ID\tArrival Time\tBurst Time\tCompletion Time\tWaiting Time\tTurnaround Time\n"); for (int i = 0; i < n; i++) { printf("%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n", processes[i].process_id, processes[i].arrival_time, processes[i].burst_time, processes[i].completion_time, processes[i].waiting_time, processes[i].turnaround_time); total_waiting_time += processes[i].waiting_time; total_turnaround_time += processes[i].turnaround_time; } printf("\nAverage Waiting Time: %.2f\n", (float)total_waiting_time / n); printf("Average Turnaround Time: %.2f\n", (float)total_turnaround_time / n); } int main() { int n; printf("Enter the number of processes: "); scanf("%d", &n); Process *processes = (Process *)malloc(n * sizeof(Process)); for (int i = 0; i < n; i++) { printf("Enter details for Process %d:\n", i + 1); printf("Process ID: "); scanf("%d", &processes[i].process_id); printf("Arrival Time: "); scanf("%d", &processes[i].arrival_time); printf("Burst Time: "); scanf("%d", &processes[i].burst_time); printf("\n"); } // 按到达时间排序 qsort(processes, n, sizeof(Process), compare); // 计算完成时间、等待时间和周转时间 calculate_times(processes, n); // 显示结果 display_results(processes, n); free(processes); return 0; } ``` #### 详细说明 - **用户输入**:通过 `scanf` 获取用户输入的进程数量和每个进程的详细信息,包括进程ID、到达时间和执行时间。 - **排序**:使用 `qsort` 函数对进程按照到达时间进行排序,确保先到的进程优先执行[^1]。 - **计算时间**:根据 FCFS 的规则,依次计算每个进程的完成时间、等待时间和周转时间。 - **输出结果**:显示每个进程的详细时间信息,并计算平均等待时间和平均周转时间。 #### 编译和运行 使用以下命令编译和运行程序: ```bash gcc -o fcfs_scheduler fcfs_scheduler.c ./fcfs_scheduler ``` --- ####
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值