コード例 #1
0
ファイル: ioctlrw.c プロジェクト: insys-projects/gipcy
int ioctl_sem_unlock(struct ipc_driver *drv, unsigned long arg)
{
    int error = 0;
    struct ipc_unlock_t ipc_param;

    if(copy_from_user(&ipc_param, (void *)arg, sizeof(struct ipc_unlock_t))) {
        err_msg(err_trace, "%s(): Error in copy_from_user()\n", __FUNCTION__);
        error = -EFAULT;
        goto do_exit;
    }

    error = ipc_sem_unlock( drv, &ipc_param );
    if(error < 0) {
        err_msg(err_trace, "%s(): Error in ipc_sem_up()\n", __FUNCTION__);
        goto do_exit;
    }

do_exit:
    return error;
}
コード例 #2
0
ファイル: test_sem_common.c プロジェクト: s-vincent/vsutils
int test_ipc_sem(enum ipc_sem_type type, void* arg)
{
    ipc_sem sem = NULL;
    pid_t p = -1;
    struct tm* timeinfo = NULL;
    time_t timeo;
    char buf[256];

    if(!ipc_sem_is_supported(type))
    {
        fprintf(stderr, "Semaphore type %d not supported!\n", type);
        return -1;
    }

    sem = ipc_sem_new(type, arg, O_CREAT, 0700, 1);
    if(!sem)
    {
        perror("ipc_sem_new");
        return -1;
    }

    p = fork();

    if(p == -1)
    {
        perror("fork");
        ipc_sem_free(&sem, 1);
        return -1;
    }
    else if(p > 0)
    {
        int status = -1;

        /* father */
        sleep(1);
        time(&timeo);
        timeinfo = localtime(&timeo);
        sprintf(buf, "[%d %d %d %d:%d:%d]", timeinfo->tm_mday,
                timeinfo->tm_mon + 1, timeinfo->tm_year + 1900,
                timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
        fprintf(stdout, "%s[FATHER] Try to lock semaphore\n", buf);
        ipc_sem_lock(sem);

        time(&timeo);
        timeinfo = localtime(&timeo);
        sprintf(buf, "[%d %d %d %d:%d:%d]", timeinfo->tm_mday,
                timeinfo->tm_mon + 1, timeinfo->tm_year + 1900,
                timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
        fprintf(stdout, "%s[FATHER] Semaphore locked\n", buf);
        ipc_sem_unlock(sem);

        time(&timeo);
        timeinfo = localtime(&timeo);
        sprintf(buf, "[%d %d %d %d:%d:%d]", timeinfo->tm_mday,
                timeinfo->tm_mon + 1, timeinfo->tm_year + 1900,
                timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
        fprintf(stdout, "%s[FATHER] Semaphore unlocked\n", buf);

        /* wait son termination */
        wait(&status);
        time(&timeo);
        timeinfo = localtime(&timeo);
        sprintf(buf, "[%d %d %d %d:%d:%d]", timeinfo->tm_mday,
                timeinfo->tm_mon + 1, timeinfo->tm_year + 1900,
                timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
        fprintf(stdout, "%s[FATHER] Son terminated\n", buf);
        fprintf(stdout, "Test OK!\n");
    }
    else
    {
        /* son */
        time(&timeo);
        timeinfo = localtime(&timeo);
        sprintf(buf, "[%d %d %d %d:%d:%d]", timeinfo->tm_mday,
                timeinfo->tm_mon + 1, timeinfo->tm_year + 1900,
                timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
        fprintf(stdout, "%s[SON] Try to lock semaphore\n", buf);
        ipc_sem_lock(sem);

        time(&timeo);
        timeinfo = localtime(&timeo);
        sprintf(buf, "[%d %d %d %d:%d:%d]", timeinfo->tm_mday,
                timeinfo->tm_mon + 1, timeinfo->tm_year + 1900,
                timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
        fprintf(stdout, "%s[SON] Semaphore locked\n", buf);
        sleep(3);
        ipc_sem_unlock(sem);

        time(&timeo);
        timeinfo = localtime(&timeo);
        sprintf(buf, "[%d %d %d %d:%d:%d]", timeinfo->tm_mday,
                timeinfo->tm_mon + 1, timeinfo->tm_year + 1900,
                timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
        fprintf(stdout, "%s[SON] Semaphore unlocked\n", buf);
    }

    ipc_sem_free(&sem, 1);
    return 0;
}