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); //解锁
}


目录
相关文章
|
3天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
18 3
|
3天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
16 2
|
24天前
|
Linux
Linux系统之expr命令的基本使用
【10月更文挑战第18天】Linux系统之expr命令的基本使用
72 4
|
13天前
|
Linux 应用服务中间件 Shell
linux系统服务二!
本文详细介绍了Linux系统的启动流程,包括CentOS 7的具体启动步骤,从BIOS自检到加载内核、启动systemd程序等。同时,文章还对比了CentOS 6和CentOS 7的启动流程,分析了启动过程中的耗时情况。接着,文章讲解了Linux的运行级别及其管理命令,systemd的基本概念、优势及常用命令,并提供了自定义systemd启动文件的示例。最后,文章介绍了单用户模式和救援模式的使用方法,包括如何找回忘记的密码和修复启动故障。
35 5
linux系统服务二!
|
13天前
|
Linux 应用服务中间件 Shell
linux系统服务!!!
本文详细介绍了Linux系统(以CentOS7为例)的启动流程,包括BIOS自检、读取MBR信息、加载Grub菜单、加载内核及驱动程序、启动systemd程序加载必要文件等五个主要步骤。同时,文章还对比了CentOS6和CentOS7的启动流程图,并分析了启动流程的耗时。此外,文中还讲解了Linux的运行级别、systemd的基本概念及其优势,以及如何使用systemd管理服务。最后,文章提供了单用户模式和救援模式的实战案例,帮助读者理解如何在系统启动出现问题时进行修复。
35 3
linux系统服务!!!
|
21天前
|
Web App开发 搜索推荐 Unix
Linux系统之MobaXterm远程连接centos的GNOME桌面环境
【10月更文挑战第21天】Linux系统之MobaXterm远程连接centos的GNOME桌面环境
169 4
Linux系统之MobaXterm远程连接centos的GNOME桌面环境
|
23天前
|
Linux 测试技术 网络安全
Linux系统之安装OneNav个人书签管理器
【10月更文挑战第19天】Linux系统之安装OneNav个人书签管理器
41 5
Linux系统之安装OneNav个人书签管理器
|
22天前
|
运维 监控 Linux
Linux系统之部署Linux管理面板1Panel
【10月更文挑战第20天】Linux系统之部署Linux管理面板1Panel
69 3
Linux系统之部署Linux管理面板1Panel
|
3天前
|
安全 网络协议 Linux
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。通过掌握 ping 命令,读者可以轻松测试网络连通性、诊断网络问题并提升网络管理能力。
18 3
|
6天前
|
安全 Linux 数据安全/隐私保护
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。本文介绍了使用 `ls -l` 和 `stat` 命令查找文件所有者的基本方法,以及通过文件路径、通配符和结合其他命令的高级技巧。还提供了实际案例分析和注意事项,帮助读者更好地掌握这一操作。
23 6