接收一组数组,并从中输出两个最小的数

接收一组数组,并从中输出两个最小的数

两个最小的数s1 s2,那就假设 数组中的第一个数和第二个数是最小的两个~
遍历数组
开始 第一个数直接从第3个数做比较,如果比它小,则把s1 的值赋值为第3个数的值。
同理s2 也从第3个数开始比较。

但会出现一个问题~
假设 9 7 6 10
初始 s1 9 s2 7
9>6
则 s1=6
然后 新的s1再和第四个数比较 …不符合
if的判断条件(s1>T[i])则会执行下面的语句

if(s2>T[i]) 那么 s2也会=6 是一个数

因此 这两个if一次

这是一个经典的生产者消费者问题,可以使用信号量和共享内存实现。下面是一个基于Linux系统的C语言程序的实现步骤: 步骤一:定义共享内存和信号量 ``` #include <sys/ipc.h> #include <sys/shm.h> #include <sys/sem.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define KEY 1234 //共享内存和信号量的key值 #define SHM_SIZE 5 //共享内存的大小 #define SEM_PRODUCER 0 //生产者信号量的编号 #define SEM_CONSUMER 1 //消费者信号量的编号 int shmid; //共享内存的id int* buffer; //共享内存的指针 int semid; //信号量的id struct sembuf sem_wait = {0, -1, SEM_UNDO}; //P操作 struct sembuf sem_signal = {0, 1, SEM_UNDO}; //V操作 void init() { //创建共享内存 shmid = shmget(KEY, SHM_SIZE * sizeof(int), IPC_CREAT | 0666); if (shmid < 0) { perror("shmget error"); exit(1); } //将共享内存映射到进程地址空间 buffer = (int*)shmat(shmid, NULL, 0); if (buffer == (void*)-1) { perror("shmat error"); exit(1); } //初始化共享内存 for (int i = 0; i < SHM_SIZE; i++) { buffer[i] = 0; } //创建信号量 semid = semget(KEY, 2, IPC_CREAT | 0666); if (semid < 0) { perror("semget error"); exit(1); } //初始化生产者信号量 if (semctl(semid, SEM_PRODUCER, SETVAL, SHM_SIZE) < 0) { perror("semctl error"); exit(1); } //初始化消费者信号量 if (semctl(semid, SEM_CONSUMER, SETVAL, 0) < 0) { perror("semctl error"); exit(1); } } ``` 步骤二:定义生产者进程和消费者进程 ``` void producer_process() { int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; for (int i = 0; i < 10; i++) { //等待生产者信号量 if (semop(semid, &sem_wait, 1) < 0) { perror("semop error"); exit(1); } //将数据写入共享内存 buffer[i % SHM_SIZE] = arr[i]; printf("Producer produced %d\n", arr[i]); //释放消费者信号量 if (semop(semid, &sem_signal, 1) < 0) { perror("semop error"); exit(1); } } exit(0); } void consumer_process(int id) { int sum = 0; while (1) { //等待消费者信号量 if (semop(semid, &sem_wait, 1) < 0) { perror("semop error"); exit(1); } //从共享内存读取数据 int data = buffer[sum % SHM_SIZE]; printf("Consumer %d consumed %d\n", id, data); //累加求和 sum += data; //释放生产者信号量 if (semop(semid, &sem_signal, 1) < 0) { perror("semop error"); exit(1); } //判断是否读取完所有数据 if (sum == 55) { break; } } printf("Consumer %d sum is %d\n", id, sum); exit(0); } ``` 步骤三:定义主函,创建进程并执行 ``` int main() { init(); pid_t pid1, pid2, pid3; //创建生产者进程 pid1 = fork(); if (pid1 < 0) { perror("fork error"); exit(1); } else if (pid1 == 0) { producer_process(); } //创建消费者进程1 pid2 = fork(); if (pid2 < 0) { perror("fork error"); exit(1); } else if (pid2 == 0) { consumer_process(1); } //创建消费者进程2 pid3 = fork(); if (pid3 < 0) { perror("fork error"); exit(1); } else if (pid3 == 0) { consumer_process(2); } //等待子进程结束 waitpid(pid1, NULL, 0); waitpid(pid2, NULL, 0); waitpid(pid3, NULL, 0); //删除共享内存和信号量 shmctl(shmid, IPC_RMID, NULL); semctl(semid, 0, IPC_RMID); return 0; } ``` 以上就是一个基于Linux系统的生产者消费者问题的C语言程序的实现步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值