include [HTML_REMOVED]
include [HTML_REMOVED]
include [HTML_REMOVED]
include [HTML_REMOVED]
include [HTML_REMOVED]
include [HTML_REMOVED]
define MAXLINE 20 // 管道容纳字节数
int main(int argc, char* argv[]) {
int n;
int com[2]; // command管道
int res[2]; // response管道
pid_t pid;
int in = atoi(argv[1]); // 命令行输入整数
if (pipe(com) < 0 || pipe(res) < 0) {
printf("pipe error");
exit(1);
}
if ((pid = fork()) < 0) {
printf("fork error");
exit(1);
}
if (pid > 0) { // 父进程为Client
close(com[0]); // 关闭com的读端口
close(res[1]); // 关闭res的写端口
for (int i = 1; i < 4; i++) {
write(com[1], &in, sizeof(int)); // 把输入送给Server
read(res[0], &in, sizeof(int)); // 等待Server处理完毕返回结果
in = in; // 这里可能需要根据实际情况进行处理
}
printf("result is %i\n", in);
kill(pid, SIGKILL); // 终止子进程,即Server进程
waitpid(pid, NULL, 0); // 回收子进程
exit(0
#include [HTML_REMOVED]
#include [HTML_REMOVED]
#include [HTML_REMOVED]
#include [HTML_REMOVED]
#include [HTML_REMOVED]
#define N 5 // 阅览室容量
#define M 8 // 学生总数
unsigned int ns = 0; // 学生计数
sem_t sem; // 信号量,用于限制学生数量
sem_t wfm; // 等待管理员开门的信号量
sem_t wfs; // 等待学生离开的信号量
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 互斥锁,用于保护共享资源
void Student(void i) {
long id = (long)i; // 学生编号
printf(“Student %ld is entering…\n”, id);
sem_wait(&sem); // 等待信号量
pthread_mutex_lock(&mutex); // 加锁保护共享资源
ns++;
if (ns == 1) {
sem_wait(&wfm);
printf(“The 1st student entered.\n”);
}
pthread_mutex_unlock(&mutex); // 解锁
printf(“Student %ld has been entered.\n”, id);
// 阅读
int time = rand() % 10 + 1; // 随机阅读时间(1-10秒)
sleep(time);
printf(“Student %ld is going to leave…\n”, id);
pthread_mutex_lock(&mutex); // 加锁保护共享资源
ns–;
printf(“Student %ld has left.\n”, id);
if (ns == 0) {
sem_post(&wfs);
printf(“The last student left.\n”);
}
pthread_mutex_unlock(&mutex); // 解锁
sem_post(&sem); // 释放信号量,允许下一个学生进入
pthread_exit(NULL);
}
void *Manager() {
printf(“Manager open door.\n”);
sem_post(&wfm);
printf(“Manager is waiting for all students to leave.\n”);
sem_wait(&wfs);
printf(“Manager close door.\n”);
pthread_exit(NULL);
}
int main() {
// 初始化信号量
sem_init(&sem, 0, N);
sem_init(&wfm, 0, 1);
sem_init(&wfs, 0, 0);
// 创建M个学生线程 pthread_t students[M]; for (long i = 0; i < M; i++) { pthread_create(&students[i], NULL, Student, (void *)i); } // 创建管理员线程 pthread_t manager; pthread_create(&manager, NULL, Manager, NULL); // 等待所有学生线程结束 for (long i = 0; i < M; i++) { pthread_join(students[i], NULL); } // 等待管理员线程结束 pthread_join(manager, NULL); // 销毁信号量 sem_destroy(&sem); sem_destroy(&wfm); sem_destroy(&wfs); return 0;
}