当前位置:  技术问答>linux和unix

求高手给点思路——信号量问题

    来源: 互联网  发布时间:2016-09-01

    本文导语:  题目: 假设你开了家租船公司,你公司有10艘游艇可以提供给客户。请编写程序来模拟船公司和客户。如果有大于10个客户同时想向船公司租船,那么必须等待。 我的思路: 先fork然后子进程作为客户端程序(客户)...

题目:
假设你开了家租船公司,你公司有10艘游艇可以提供给客户。请编写程序来模拟船公司和客户。如果有大于10个客户同时想向船公司租船,那么必须等待。

我的思路:
先fork然后子进程作为客户端程序(客户),父进程作为服务器程序(租船公司),但是具体不懂怎么写~请高手指点下~


#include 
#include 
#include 
#include 
#include 

int semid; //全局变量
union semun {
    int              val;    /* Value for SETVAL */
    struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
    unsigned short  *array;  /* Array for GETALL, SETALL */
    struct seminfo  *__buf;  /* Buffer for IPC_INFO
                             (Linux specific) */
};

int sem_p(void);
int sem_v(void);
int sem_init(void);
void sem_del(void);

int main(int argc, char *argv[])
{
pid_t pid;
pid = fork();

if (pid == -1)
{
perror("fork");
exit(-1);
}
else if (pid == 0) //child process
{

}
else              //parent process
{
}
return 0;
}

int sem_init(void) //信号量初始化
{
union semun sem;
sem.val = 10;

if (semctl(semid, 0, SETVAL, sem) == -1)
{
perror("semctl");
exit(-1);
}
return 0;
}

int sem_p(void)  //P操作
{
num--;
struct sembuf sem;
sem.sem_num = 0;
sem.sem_op = -1;
sem.sem_flg = SEM_UNDO;

if (semop(semid, &sem, 1) == -1)
{
perror("semop p");
exit(-1);
}
printf("还有%d个n",num);
fflush(stdout);
return 0;
}

int sem_v(void) //V操作
{
num++;
struct sembuf sem;
sem.sem_num = 0;
sem.sem_op = +1;
sem.sem_flg = SEM_UNDO;

if (semop(semid, &sem, 1) == -1)
{
perror("semop v");
exit(-1);
}
return 0;
}

void sem_del(void) //删除信号
{
union semun semval;
if (semctl(semid, 0, IPC_RMID, semval) == -1)
{
perror("semdel");
exit(-1);
}
}


|
直接用POSIX信号量就行。
用多进程和多线程都可以,下面我用多线程写了一个,不知道是不是你想要的!
编译的时候别忘了加 -pthread

#include 
#include 
#include 
#include 
#include 

#define NUM 20 //20个客户

sem_t sem;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t  cond = PTHREAD_COND_INITIALIZER;
int count = 0;

void * thread_routine(void *arg);

int main()
{
int i;
pthread_t tid;

sem_init(&sem, 0, 10);
for (i = 0; i 

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 高手进,只求思路,不求代码!
  • 【高手请进】只让用户执行有限的指定的几个命令,有什么思路呢?
  • 多进程通讯问题,请高手们给点思路吧
  • 请教高手!利用ARM开发板发视频,帮忙里一下思路。。
  • 工作站Redhat Linux7.2如何通过NT4.0 proxy代理服务器上网,我不能通过其验证!请高手指点思路和方法!
  • 两道关于C语言的编程问题,自己有点思路,但是不知何处下手编写代码,请高手帮忙~
  • 高手,高手,高高手请进!
  • 有熟悉EXIM的高手高手么??
  • to 高手:学java应该怎样一步步学习,从菜鸟到高手.
  • 高分请高手,高手定能解决
  • 请问高手在linux中用什么命令可以做linux的启动盘???在等待高手??
  • 有高手研究Agent++麽?里面有个thread.h,蛮难读的,请高手指点
  • 难道高手区里的人就是高手?
  • 在dos下用bc31挑战高手******开发mssql程序,连接时报link err:undefined symbol GETNOTE in module DBEXTERN?(挑战高手)
  • 真正的linux高手,请看过来,看你符合高手标准不?
  • 难道这没有高手吗?难道这没有乐于助人的高手?(高分酬谢62+50+50)
  • 关于我对linux高手用yum,非高手用源码的理由
  • 高手救命,很急——ORACLE817安装在UNIXWARE711上,手工启动数据库后在netasst中连接错误,高手帮我看看?
  • 请教高手lvs的奇怪问题,我挺着急,希望高手别潜水,就就我,先谢谢了
  • 各个高手看看这个问题!本人第一次学习java所以要各位高手的帮助。。
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 我是新手,高手,高手,快来救我
  • EJB问题,请教高手(非高手莫进)
  • 请各位JAVA高手,网业高手看过来,我把能给的分都送出!!!只能给37分,哎!!
  • eWEEK沙龙征集高手座谈


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3