Почему semop () зависает? - PullRequest
2 голосов
/ 23 декабря 2010

При попытке запустить этот код: сначала он печатает «Process some_id BEFORE enter» для каждой семафоры (2 раза). Тогда это висит. Что не так?

# include <sys/ipc.h>
# include <sys/sem.h>
# include <unistd.h>
# include <errno.h>
# include <stdio.h>
# include <stdlib.h>
# include <iostream>

int seminit()
{
    key_t key = ftok("/bin", 1);
    int semid = semget (key, 1, IPC_CREAT | IPC_EXCL | 600);
    if(-1 == semid)
        if(EEXIST == errno)
            semid = semget(key, 1, 0);
    return semid;
}

void uninit(int semid)
{
        semctl(semid, 0, IPC_RMID);
}

void semlock(int semid)
{
    struct sembuf p_buf;
    p_buf.sem_num = 0;
    p_buf.sem_op = -1;
    p_buf.sem_flg = SEM_UNDO;
    if(semop(semid, &p_buf, 1) == -1)
        printf("semlock failed: ERRNO: %d\n", errno);
}
void semunlock(int semid)
{
    struct sembuf v_buf;
    v_buf.sem_num = 0;
    v_buf.sem_op = 1;
    v_buf.sem_flg = SEM_UNDO;
    if(semop(semid, &v_buf, 1) == -1)
        printf("semunlock failed: ERRNO: %d\n", errno);
}
void some_function()
{
    int semid = seminit();
    pid_t pid = getpid();
    printf("Process %d BEFORE enter\n", pid);
    semlock(semid);
    printf("Process %d IN Critical section\n", pid);
    sleep(10);
    semunlock(semid);
    printf("Process %d AFTER leave\n", pid);
    uninit(semid);
}

int main(int argc, char** argv) 
{
    for(int i = 0; i < 2; ++i)
        if(0 == fork())
            some_function();
    return (EXIT_SUCCESS);
}

1 Ответ

2 голосов
/ 23 декабря 2010

Кажется, что генерируется только дочерний элемент (я думаю, что он не предназначен), тем не менее, я полагаю, что до возвращения основного процесса пропущено ожидание, что означает, что основной процесс завершится быстрее, чем дочерний процесс и пусть он «зависнет» (это может быть частью проблемы, но это не проблема дыры, проверьте это для цикла перед этим).

...