2010-12-23 87 views
2

尝试运行此代码时:首先打印每个信号灯(2次)之前“处理some_id之前”。然后它挂起。什么是不正确的?为什么semop()挂起?

# 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); 
} 
+0

此代码意味着什么?你如何期待它的工作?我感到困惑的主要,似乎分叉一次,只做在子进程的任何工作。 – abelenky 2010-12-23 19:02:18

+0

啊我误会了,因为操作符会从0运行到1(编辑) – 2010-12-23 19:08:26

回答

1

似乎只有一个孩子产生的(我认为这是不打算),但是,我相信这是返回主进程,这意味着主进程将结束的速度比以前缺少的等待孩子的过程,让它“绞死”(这可能是问题的一部分,但不是可能的漏洞问题,检查之前的循环)。