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


目录
相关文章
|
1月前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
80 3
|
1月前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
72 2
|
4天前
|
存储 缓存 监控
Linux缓存管理:如何安全地清理系统缓存
在Linux系统中,内存管理至关重要。本文详细介绍了如何安全地清理系统缓存,特别是通过使用`/proc/sys/vm/drop_caches`接口。内容包括清理缓存的原因、步骤、注意事项和最佳实践,帮助你在必要时优化系统性能。
112 78
|
8天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
39 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
1月前
|
缓存 Java Linux
如何解决 Linux 系统中内存使用量耗尽的问题?
如何解决 Linux 系统中内存使用量耗尽的问题?
120 48
|
4天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
44 13
|
28天前
|
Ubuntu Linux 网络安全
linux系统ubuntu中在命令行中打开图形界面的文件夹
在Ubuntu系统中,通过命令行打开图形界面的文件夹是一个高效且实用的操作。无论是使用Nautilus、Dolphin还是Thunar,都可以根据具体桌面环境选择合适的文件管理器。通过上述命令和方法,可以简化日常工作,提高效率。同时,解决权限问题和图形界面问题也能确保操作的顺利进行。掌握这些技巧,可以使Linux操作更加便捷和灵活。
20 3
|
5天前
|
Ubuntu Linux C++
Win10系统上直接使用linux子系统教程(仅需五步!超简单,快速上手)
本文介绍了如何在Windows 10上安装并使用Linux子系统。首先,通过应用商店安装Windows Terminal和Linux系统(如Ubuntu)。接着,在控制面板中启用“适用于Linux的Windows子系统”并重启电脑。最后,在Windows Terminal中选择安装的Linux系统即可开始使用。文中还提供了注意事项和进一步配置的链接。
17 0
|
1月前
|
存储 运维 Linux
如何在 Linux 系统中使用 envsubst 命令替换环境变量?
`envsubst` 是 Linux 系统中用于替换文本中环境变量值的实用工具。本文分三部分介绍其工作原理、使用方法及实际应用,包括配置文件替换、脚本执行中环境变量替换和动态生成文件等场景,帮助用户高效利用 `envsubst` 进行开发和运维工作。
52 4
|
1月前
|
Linux
在 Linux 系统中,`find` 命令
在 Linux 系统中,`find` 命令
33 1
下一篇
DataWorks