Task之暂缓执行

2021-09-15 12:33:09 浏览数 (3)

分享一段代码,pipe的一个使用案例

代码语言:javascript复制
/* pipeServer.c - reads requests over pipe */

#include <stdio.h>
#include <ioLib.h>
#include <pipeDrv.h>
#include <taskLib.h>

typedef struct
    {
    VOIDFUNCPTR pRoutine;
    int         arg;
    }MSG_REQUEST;

#define TASK_PRI    254                     /* server priority */
#define TASK_STACK  20000                   /* server stack space */
#define PIPE_NAME   "/pipe/server"
#define NUM_MSGS    10

static int pipeFd;

/**************************************************
 * Server task which reads from a pipe
 * and executes the function passed in the MSG_REQUEST data structure.
 */
LOCAL void pipeServer()
{
    MSG_REQUEST msgRequest;

    while(read(pipeFd,(char *)&msgRequest,sizeof(MSG_REQUEST))>0)
        {
        if(NULL != msgRequest.pRoutine)
            {
            (*msgRequest.pRoutine)(msgRequest.arg);
            }
        }
    }

/**************************************************
 * Initializes a server task to execute functons at a low priority.
 * Uses pipes as the communication mechanism.
 *
 * RETURNS: OK or ERROR on failure.
 */
STATUS serverStart()
{
    /* Create the pipe device */
    if(pipeDevCreate(PIPE_NAME, NUM_MSGS, sizeof(MSG_REQUEST)) == ERROR)
        return (ERROR);

    /* Open the pipe */
    if((pipeFd = open(PIPE_NAME,UPDATE,0)) == ERROR)
        return (ERROR);

    /* Spawn the server task */
    if(taskSpawn("tServer", TASK_PRI, 0, TASK_STACK,
                (FUNCPTR)pipeServer,0,0,0,0,0,0,0,0,0,0) == ERROR)
        {
        close(pipeFd);
        return (ERROR);
        }
    printf("pipe server startedn");
    return (OK);
    }

/**************************************************
* Sends a request to the server to
* execute a function at the server's priority.
*
* RETURNS: OK or ERROR on failure.
*/
STATUS serverSend(VOIDFUNCPTR pRoutine, int arg)
{
    MSG_REQUEST msgRequest;
    int         status = ERROR;

    if(ERROR != pipeFd)
        {
        /* Initialize the message structure */
        msgRequest.pRoutine = pRoutine;
        msgRequest.arg      = arg;

        /* Send the message and return the results */
        status = write(pipeFd, (char *)&msgRequest, sizeof(MSG_REQUEST));
        if(status == sizeof(MSG_REQUEST))
            {
            status = OK;
            }
        }
    return (status);
    }

这段代码的作用是什么?看标题!

贴个图吧

有异议的请留言

0 人点赞