信号量(Semaphore)是一种用于控制多个进程或线程对共享资源的访问的同步机制。它通过一个计数器来实现,计数器的值表示可用资源的数量。当一个进程或线程请求访问资源时,信号量的计数器会减一;当释放资源时,计数器会加一。如果计数器的值为零,则请求访问的进程或线程将被阻塞,直到有其他进程或线程释放资源。
在Linux系统中,可以使用ipcs
命令来查看信号量的相关信息。具体命令如下:
ipcs -s
该命令会列出系统中所有的信号量集,包括每个信号量集的键值、所有者、权限、创建时间等信息。
以下是一个简单的示例,展示如何在C语言中使用信号量进行进程间同步:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#define SEM_KEY 1234
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
};
int create_semaphore() {
key_t key = ftok(".", SEM_KEY);
if (key == -1) {
perror("ftok");
exit(1);
}
int sem_id = semget(key, 1, IPC_CREAT | 0666);
if (sem_id == -1) {
perror("semget");
exit(1);
}
union semun arg;
arg.val = 1;
if (semctl(sem_id, 0, SETVAL, arg) == -1) {
perror("semctl");
exit(1);
}
return sem_id;
}
void semaphore_wait(int sem_id) {
struct sembuf sb = {0, -1, SEM_UNDO};
if (semop(sem_id, &sb, 1) == -1) {
perror("semop");
exit(1);
}
}
void semaphore_signal(int sem_id) {
struct sembuf sb = {0, 1, SEM_UNDO};
if (semop(sem_id, &sb, 1) == -1) {
perror("semop");
exit(1);
}
}
int main() {
int sem_id = create_semaphore();
pid_t pid = fork();
if (pid == 0) {
// 子进程
semaphore_wait(sem_id);
printf("Child process is running\n");
sleep(2);
semaphore_signal(sem_id);
exit(0);
} else if (pid > 0) {
// 父进程
semaphore_wait(sem_id);
printf("Parent process is running\n");
semaphore_signal(sem_id);
} else {
perror("fork");
exit(1);
}
return 0;
}
通过上述命令和示例代码,你可以更好地理解和应用Linux系统中的信号量机制。
领取专属 10元无门槛券
手把手带您无忧上云