Linux系统大神随笔

简介: Linux系统大神随笔

/*

车站售票系统

20210329102113718.png20210329102113553.png

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/types.h>

//车票数量

int ticket1 = 20;
int ticket2 = 10;
int ticket3 = 30;

//乘客已购买的票

int ticket1_ok;
int ticket2_ok;
int ticket3_ok;

//线程

void *task1(void *arg);
void *task2(void *arg);
void *task3(void *arg);

//信号处理函数

void sig_handler(int arg);
int key, key1, q = 1;
pthread_mutex_t lock;
int main(void)
{
pthread_t tid1, tid2, tid3;

//线程的指针

int fd1, fd2, ds3;    //进程的id
pthread_mutex_init(&lock, NULL);  //动态创建线程互斥锁
printf("欢迎使用xx售票系统!\r\n");
while(1)
{
  printf("请选择需要的服务\r\n");
  printf("1、买票, 2、退票, 3、改签, 4、 退出系统\r\n");
  scanf("%d", &key);
  printf("\r\n");
  switch(key)
  {
    case 1: 
        pthread_create(&tid1, NULL, task1, NULL); //创建线程1,买票
        pthread_join(tid1, NULL); //等待线程运行结束
        break;
    case 2: 
        pthread_create(&tid2, NULL, task2, NULL); //创建线程2,退票
        pthread_join(tid2, NULL); //等待线程运行结束
        break;
    case 3: 
        pthread_create(&tid3, NULL, task3, NULL); //创建线程3,改签
        pthread_join(tid3, NULL); //等待线程运行结束
        break;
    case 4: 
        pthread_mutex_destroy(&lock); //销毁互斥锁
        return 0; //结束进程
  }
}
return 0;
}

//线程1,买票

void *task1(void *arg)
{
int num;
while(1)
{
  printf("当前剩余票数:广州:%d    深圳:%d    肇庆:%d\r\n", ticket1, ticket2, ticket3);
  printf("请问您要购买哪个地方的票\r\n");
  printf("1、广州, 2、深圳, 3、肇庆, 4、退出\r\n-----输入相应数字即可\r\n");
  scanf("%d", &key1);
  printf("\r\n");
  if(key1 == 4)
  {
    printf("\r\n");
    pthread_exit(0);  //结束当前线程
  }
  printf("请问您需要购买几张\r\n");
  scanf("%d", &num);
  printf("\r\n");
  if(key1 == 1)
  {
    if((ticket1 - num) >= 0)
    {
      ticket1 -= num;   //系统剩余的票数
      ticket1_ok += num;  //乘客手中的票数
      printf("购票成功!\r\n");
    }
    else
    {
      printf("购票失败---目前前往广州的票还剩%d张!\r\n", ticket1);
    }
    printf("\r\n");
  }
  else if(key1 == 2)
  {
    if((ticket2 - num) >= 0)
    {
      ticket2 -= num;
      ticket2_ok += num;
      printf("购票成功!\r\n");
    }
    else
    {
      printf("购票失败---目前前往深圳的票还剩%d张!\r\n", ticket2);
    }
    printf("\r\n");
  }
  else if(key1 == 3)
  {
    if((ticket3 - num) >= 0)
    {
      ticket3 -= num;
      ticket3_ok += num;
      printf("购票成功!\r\n");
    }
    else
    {
      printf("购票失败---目前前往肇庆的票还剩%d张!\r\n", ticket3);
    }
    printf("\r\n");
  }
}

//线程2,退票

void *task2(void *arg)
{
char temp = 0; //有哪几种票
char flag1 = 0, flag2 = 0, flag3 = 0; //票的种类
char flag11 = 0, flag22 = 0, flag33 = 0;
int i, rec;
char rec1, rec2, rec3;
if(ticket1_ok > 0)
{
  printf("您购买了%d张前往广州的票!\r\n", ticket1_ok);
  temp ++;
  flag1 = 1;
}
if(ticket2_ok > 0)
{
  printf("您购买了%d张前往深圳的票!\r\n", ticket2_ok);
  temp ++;
  flag2 = 1;
}
if(ticket3_ok > 0)
{
  printf("您购买了%d张前往肇庆的票!\r\n", ticket3_ok);
  temp ++;
  flag3 = 1;
}
if(ticket1_ok == 0 && ticket2_ok == 0 && ticket3_ok == 0)
{
  pthread_mutex_lock(&lock);//加锁
  printf("您还没购票!无法为您提供退票服务!\r\n");
  printf("10秒后自动关闭该界面!");
  signal(14, sig_handler);
  alarm(10);        //10秒后自动结束该线程
  for(i = 10; i >= 0; i--)
  {
    printf("%d\r\n", i);  //倒计时显示
    sleep(1);
  }
  //while(q);
  printf("\r\n");
  pthread_exit(0);  //结束当前线程
}
//手中有票
while(1)
{
  rec1 = flag1;
  rec2 = flag2;
  rec3 = flag3;
  printf("请问你需要退的票是?(按4退出该界面!)\r\n");
  for(i = 1; i <= temp; i++)  //判断已买的票,并排序
  {
    if(rec1 > 0)  
    {
      printf("%d:广州\t", i);
      rec1 = 0;
      flag11 = i; //票的序号
    }
    else if(rec2 > 0)
    {
      printf("%d:深圳\t", i);
      rec2 = 0;
      flag22 = i;
    }
    else if(rec3 > 0)
    {
      printf("%d:肇庆\t", i);
      rec3 = 0;
      flag33 = i;
    }
  }
  printf("\r\n");
  scanf("%d", &rec);    //选择要退的票
  printf("\r\n");
  if(rec == flag11)   //退广州的票
  {
    printf("您可以退%d张前往广州的票,请问您需要退几张?\r\n", ticket1_ok);
    scanf("%d", &rec);    //退几张
    printf("\r\n");
    if(rec > ticket1_ok)
    {
      printf("您至多退%d张票\r\n", ticket1_ok);
    }
    else
    {
      ticket1_ok -= rec;  //原有的票减去要退的票
      ticket1 += rec;   //系统中的票加上退票
      if(ticket1_ok > 0)  printf("您还有%d张前往广州的票!\r\n", ticket1_ok);
      else  
      {
        printf("您已经没有了前往广州的票!\r\n");
        flag1 = 0;
        flag11 = 110;
      }
    }
    printf("\r\n");
  }
  else if(rec == flag22)
  {
    printf("您可以退%d张前往深圳的票,请问您需要退几张?\r\n", ticket2_ok);
    scanf("%d", &rec);
    printf("\r\n");
    if(rec > ticket2_ok)
    {
      printf("您至多退%d张票\r\n", ticket2_ok);
    }
    else
    {
      ticket2_ok -= rec;
      ticket2 += rec;
      if(ticket2_ok > 0)  printf("您还有%d张前往深圳的票!\r\n", ticket2_ok);
      else  
      {
        printf("您已经没有了前往深圳的票!\r\n");
        flag2 = 0;
        flag22 = 120;
      }
    }
    printf("\r\n");
  }
  else if(rec == flag33)
  {
    printf("您可以退%d张前往肇庆的票,请问您需要退几张?\r\n", ticket3_ok);
    scanf("%d", &rec);
    if(rec > ticket3_ok)
    {
      printf("您至多退%d张票\r\n", ticket3_ok);
    }
    else
    {
      ticket3_ok -= rec;
      ticket3 += rec;
      if(ticket3_ok > 0)  printf("您还有%d张前往肇庆的票!\r\n", ticket3_ok);
      else  
      {
        printf("您已经没有了前往肇庆的票!\r\n");
        flag3 = 0;
        flag33 = 130;
      }
    }
    printf("\r\n");
  }
  else if(rec == 4)
  {
    pthread_exit(0);//结束当前线程
  }
}

//线程3,改签

void *task3(void *arg)
{
int temp = 0, temp1 = 0; //有几种票
char flag1 = 0, flag2 = 0, flag3 = 0; //票的类型
char flag11 = 0, flag22 = 0, flag33 = 0, flag44 = 0, flag55 = 0, flag66 = 0;
char remain1, remain2, remain3; //系统剩下票的标志位
char rec1, rec2, rec3, rec4, rec5, rec6;
int local1, local2; //改签的源、目地点
int num = 0;
char i;
while(1)
{
  if(ticket1_ok > 0 | ticket2_ok > 0 | ticket3_ok > 0)  //手上有票
  {
    printf("您现在有:");
    if(ticket1_ok > 0)  
    {
      printf("%d张前往广州的票\t", ticket1_ok);
      temp++;
      flag1 = 1;
    }
    if(ticket2_ok > 0)
    {
      printf("%d张前往深圳的票\t", ticket2_ok);
      temp++;
      flag2 = 1;
    }
    if(ticket3_ok > 0)  
    {
      printf("%d张前往肇庆的票", ticket3_ok);
      temp++;
      flag3 = 1;
    }
    printf("\r\n");
  }
  else  //手上没票
  {
    pthread_mutex_lock(&lock);  //加锁
    printf("您还没买票,无法为您提供改签服务!如有需要,请到买票窗口买票\r\n");
    printf("10秒后自动关闭该界面!");
    signal(14, sig_handler);
    alarm(10);        //10秒后自动结束该线程
    for(i = 10; i >= 0; i--)
    {
      printf("%d\r\n", i);  //倒计时显示
      sleep(1);
    }
    printf("\r\n");
    pthread_exit(0);  //结束当前线程
  }
  if(ticket1 > 0 | ticket2 > 0 | ticket3 > 0)   //系统中还有余票
  {
    printf("现在系统剩余的票有:\r\n");
    if(ticket1 > 0)
    {
      printf("    前往广州的票还有%d张\r\n", ticket1);
      remain1 = 1;
      temp1++;
    }
    if(ticket2 > 0)
    {
      printf("    前往深圳的票还有%d张\r\n", ticket2);
      remain2 = 1;
      temp1++;
    }
    if(ticket3 > 0)
    {
      printf("    前往肇庆的票还有%d张\r\n", ticket3);
      remain3 = 1;
      temp1++;
    }
  }
  else  //系统中没有余票
  {
    pthread_mutex_lock(&lock);  //加锁
    printf("不好意思,现在系统中已经没有余票了!\r\n");
    printf("您可以等别人退票或者等加仓!\r\n");
    printf("10秒后自动关闭该界面!");
    signal(14, sig_handler);
    alarm(10);        //10秒后自动结束该线程
    for(i = 10; i >= 0; i--)
    {
      printf("%d\r\n", i);  //倒计时显示
      sleep(1);
    }
    printf("\r\n");
    pthread_exit(0);  //结束当前线程
  }
 /*********************************************************************/
  rec1 = flag1;
  rec2 = flag2;
  rec3 = flag3; 
  rec4 = remain1;
  rec5 = remain2;
  rec6 = remain3;
  printf("请问您要改签那种票(按4退出该界面!)\r\n");
  for(i = 1; i <= temp; i++)
  {
    if(rec1 > 0)  //flag1 = 0时才不打印
    {
      printf("%d:广州    ", i);
      rec1 = 0;
      flag11 = i;   //票的序号
    }
    else if(rec2 > 0)
    {
      printf("%d:深圳    ", i);
      rec2 = 0;
      flag22 = i;
    }
    else if(rec3 > 0)
    {
      printf("%d:肇庆    ", i);
      rec3 = 0;
      flag33 = i;
    }
  }
  printf("\r\n");
  scanf("%d", &local1);
  printf("\r\n");
  if(local1 == 4)
  {
    pthread_exit(0);//结束当前线程
  }
  printf("现在有票的地点有:\r\n");
  for(i = 1; i <= temp1; i++)
  {
    if(rec4 > 0)  
    {
      printf("%d:广州    ", i);
      rec4 = 0; //flag4 = 0时才不打印
      num = 1;
      flag44 = i;
    }
    else if(rec5 > 0)
    {
      printf("%d:深圳    ", i);
      rec5 = 0;
      num = 1;
      flag55 = i;
    }
    else if(rec6 > 0)
    {
      printf("%d:肇庆    ", i);
      rec6 = 0;
      num = 1;
      flag66 = i;
    }
  }
  printf("\r\n");
  if(num == 0)    //不能改签
  {
    printf("\r\n");
    printf("目前没有能改签的地方\r\n");
    printf("您可以等别人退票或者等加仓!\r\n");
    printf("\r\n");
  }
  else  //能改签
  {
    printf("\r\n");
    printf("请问您要改签到什么地方?\r\n");
    scanf("%d", &local2);   //目地点
    printf("请问您需要改签几张\r\n");
    scanf("%d", &num);
    if(local1 == flag11)    //原地点是广州
    {
      if(ticket1_ok < num)  //手上的票数少过要改的数量
      {
        printf("改签失败,您手上没有%d张原地点是广州的票\r\n", num);
      }
      else if(local2 == flag44)       //目地点是广州
      {
        printf("不能改签到一样的地方!\r\n");
      }
      else if(local2 == flag55)       //目地点是深圳
      {
        if(num > ticket2)   //系统现有的票数少过要改的数量
        {
          printf("改签失败,现在系统中仅有%d张前往深圳的票\r\n", ticket2);
        }
        else
        {
          printf("改签成功!\r\n");
          ticket1_ok -= num;    //手上前往广州的票
          ticket1 += num;   //系统中前往广州的票
          ticket2_ok += num;    //手上前往深圳的票
          ticket2 -= num;   //系统中前往深圳的票
        }
      }
      else if(local2 == flag66)       //目地点是肇庆
      {
        if(num > ticket3)   //系统现有的票数少过要改的数量
        {
          printf("改签失败,现在系统中仅有%d张前往肇庆的票\r\n", ticket3);
        }
        else
        {
          printf("改签成功!\r\n");
          ticket1_ok -= num;    //手上前往广州的票
          ticket1 += num;   //系统中前往广州的票
          ticket3_ok += num;    //手上前往肇庆的票
          ticket3 -= num;   //系统中前往肇庆的票
        }
      }
    }
    else if(local1 == flag22) //原地点是深圳
    {
      if(ticket2_ok < num)  //手上的票数少过要改的数量
      {
        printf("改签失败,您手上没有%d张原地点是深圳的票\r\n", num);
      }
      else if(local2 == flag44)       //目地点是广州
      {
        if(num > ticket2)   //系统现有的票数少过要改的数量
        {
          printf("改签失败,现在系统中仅有%d张前往广州的票\r\n", ticket1);
        }
        else
        {
          printf("改签成功!\r\n");
          ticket2_ok -= num;    //手上前往深圳的票
          ticket2 += num;   //系统中前往深圳的票
          ticket1_ok += num;    //手上前往广州的票
          ticket1 -= num;   //系统中前往广州的票
        }
      }
      else if(local2 == flag55)       //目地点是深圳
      {
        printf("不能改签到一样的地方!\r\n");
      }
      else if(local2 == flag66)       //目地点是肇庆
      {
        if(num > ticket3)   //系统现有的票数少过要改的数量
        {
          printf("改签失败,现在系统中仅有%d张前往肇庆的票\r\n", ticket3);
        }
        else
        {
          printf("改签成功!\r\n");
          ticket2_ok -= num;    //手上前往深圳的票
          ticket2 += num;   //系统中前往深圳的票
          ticket3_ok += num;    //手上前往肇庆的票
          ticket3 -= num;   //系统中前往肇庆的票
        }
      }
    }
    else if(local1 == flag33) //原地点是肇庆
    {
      if(ticket3_ok < num)  //手上的票数少过要改的数量
      {
        printf("改签失败,您手上没有%d张原地点是肇庆的票\r\n", num);
      }
      else if(local2 == flag44)       //目地点是广州
      {
        if(num > ticket2)   //系统现有的票数少过要改的数量
        {
          printf("改签失败,现在系统中仅有%d张前往广州的票\r\n", ticket1);
        }
        else
        {
          printf("改签成功!\r\n");
          ticket3_ok -= num;    //手上前往肇庆的票
          ticket3 += num;   //系统中前往肇庆的票
          ticket1_ok += num;    //手上前往广州的票
          ticket1 -= num;   //系统中前往广州的票
        }
      }
      else if(local2 == flag55)       //目地点是深圳
      {
        if(num > ticket3)   //系统现有的票数少过要改的数量
        {
          printf("改签失败,现在系统中仅有%d张前往深圳的票\r\n", ticket2);
        }
        else
        {
          printf("改签成功!\r\n");
          ticket3_ok -= num;    //手上前往肇庆的票
          ticket3 += num;   //系统中前肇庆圳的票
          ticket2_ok += num;    //手上前往深圳的票
          ticket2 -= num;   //系统中前往深圳的票
        }
      }
      else if(local2 == flag66)       //目地点是肇庆
      {
        printf("不能改签到一样的地方!\r\n");
      }
    }
    printf("\r\n"); 
  }
  //标志位清零
  temp = temp1 = flag1 = flag11 = flag2 = flag22 = flag3 = flag33 = flag44 = flag55 = flag66 = 0;
}
}

//信号处理函数

void sig_handler(int arg)
{
q = 0;
pthread_mutex_unlock(&lock); //解锁
}


目录
相关文章
|
6天前
|
Ubuntu 安全 Linux
《Linux 简易速速上手小册》第1章: Linux 系统基础(2024 最新版)
《Linux 简易速速上手小册》第1章: Linux 系统基础(2024 最新版)
40 1
|
14天前
|
资源调度 JavaScript 搜索推荐
Linux系统之部署envlinks极简个人导航页
【4月更文挑战第11天】Linux系统之部署envlinks极简个人导航页
53 2
|
16天前
|
缓存 Linux 测试技术
安装【银河麒麟V10】linux系统--并挂载镜像
安装【银河麒麟V10】linux系统--并挂载镜像
83 0
|
16天前
|
监控 Unix Linux
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
30 0
|
14天前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
38 6
|
1天前
|
Ubuntu Linux
Linux(Ubuntu)系统临时IP以及静态IP配置(关闭、启动网卡等操作)
请注意,以上步骤是在临时基础上进行配置的。如果要永久保存静态IP地址,通常还需要修改 `/etc/network/interfaces`文件,以便在系统重启后保持配置。同时,确保备份相关配置文件以防止出现问题。
9 1
|
1天前
|
Linux 数据安全/隐私保护
Linux系统忘记密码的三种解决办法
这篇博客介绍了三种在Linux忘记密码时重置登录密码的方法:1) 使用恢复模式,通过控制台界面以管理员权限更改密码;2) 利用Linux Live CD/USB启动,挂载硬盘分区并使用终端更改密码;3) 进入单用户模式,自动以管理员身份登录后重置密码。每个方法都提供了详细步骤,提醒用户在操作前备份重要数据。
|
2天前
|
JSON Unix Linux
Linux系统之jq工具的基本使用
Linux系统之jq工具的基本使用
26 1
|
2天前
|
数据采集 监控 安全
linux系统被×××后处理经历
linux系统被×××后处理经历
|
2天前
|
监控 安全 Linux
Linux系统之安装ServerBee服务器监控工具
【4月更文挑战第22天】Linux系统之安装ServerBee服务器监控工具
40 2