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);
}
此代码意味着什么?你如何期待它的工作?我感到困惑的主要,似乎分叉一次,只做在子进程的任何工作。 – abelenky 2010-12-23 19:02:18
啊我误会了,因为操作符会从0运行到1(编辑) – 2010-12-23 19:08:26