【问题标题】:Why semop() hangs?为什么 semop() 挂起?
【发布时间】:2010-12-23 18:54:24
【问题描述】:

尝试运行此代码时:首先,它为每个信号量打印“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);
}

【问题讨论】:

  • 这段代码是做什么用的?你期望它如何工作?我对 main 感到困惑,它似乎分叉了一次,并且只对子进程进行任何工作。
  • 啊我错了,因为运算符将从0运行到1(已编辑)

标签: c++ c linux semaphore


【解决方案1】:

似乎只生成了一个子进程(我认为这不是故意的),但我认为在主进程返回之前缺少等待,这意味着主进程将比子进程更快地结束并且让它“挂起”(这可能是问题的一部分,但可能不是漏洞问题,请检查之前的循环)。

【讨论】:

  • +1 你是对的。但是我应该如何等到 fork 进程结束。我的意思是这是什么功能? (等待()不起作用)
  • 这里描述了两种等待函数:linux.about.com/od/commands/l/blcmdl2_wait.htm 似乎您需要的是 waitpid() 一种,它接收进程的 PID 并等待该进程结束。试着在那个页面上看一下。如果您仍有问题,请在此处发表评论。 PS:周围没有我的 linux c 东西:\
猜你喜欢
  • 2012-10-27
  • 2018-03-12
  • 1970-01-01
  • 2017-10-17
  • 2021-06-09
  • 2012-12-02
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多