#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <limits.h>
#include <errno.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#define PERMS S_IRUSR | S_IWUSR
#define SET_SIZE 2
void set_sembuf_struct(struct sembuf *s, int semnum, int semop, int semflg)
{
s->sem_num = (short)semnum;
s->sem_op = semop;
s->sem_flg = semflg;
return;
}
int remove_semaphore(int semid)
{
return semctl(semid, 0, IPC_RMID);
}
int main (int argc, char *argv[])
{
char buffer[MAX_CANON];
char *c;
int i;
int n;
pid_t childpid;
int semid;
int semop_ret;
struct sembuf semwait[1];
struct sembuf semsignal[1];
int status;
if ( (argc != 2) || ((n = atoi (argv[1])) <= 0) ) {
fprintf (stderr, "Usage: %s number_of_processes\n", argv[0]);
exit(1);
}
/* Create a semaphore containing a single element */
if ((semid = semget(IPC_PRIVATE, SET_SIZE, PERMS)) == -1) {
fprintf(stderr, "[%ld]: Could not access semaphore: %s\n",
(long)getpid(), strerror(errno));
exit(1);
}
/* Initialize the semaphore element to 1 */
set_sembuf_struct(semwait, 0, -1, 0);
set_sembuf_struct(semsignal, 0, 1, 0);
if (semop(semid, semsignal, 1) == -1) {
fprintf(stderr, "[%ld]: semaphore increment failed - %s\n",
(long)getpid(), strerror(errno));
if (remove_semaphore(semid) == -1)
fprintf(stderr, "[%ld], could not delete semaphore - %s\n",
(long)getpid(), strerror(errno));
exit(1);
}
for (i = 1; i < n; ++i)
if (childpid = fork())
break;
sprintf(buffer,
"i:%d process ID:%ld parent ID:%ld child ID:%ld\n",
i, (long)getpid(), (long)getppid(), (long)childpid);
c = buffer;
/************************entry section *************************/
while(( (semop_ret = semop(semid, semwait, 1)) == -1) &&
(errno == EINTR))
;
if (semop_ret == -1)
fprintf(stderr, "[%ld]: semaphore decrement failed - %s\n",
(long)getpid(), strerror(errno));
else {
/****************start of critical section *********************/
while (*c != '\0') {
fputc(*c, stderr);
c++;
}
fputc('\n', stderr);
/******************end of critical section *********************/
/*********************** exit section **************************/
while(((semop_ret = semop(semid, semsignal, 1)) == -1) &&
(errno == EINTR))
;
if (semop_ret == -1)
fprintf(stderr, "[%ld]: semaphore increment failed - %s\n",
(long)getpid(), strerror(errno));
}
/******************** remainder section ************************/
while((wait(&status) == -1) && (errno == EINTR))
;
if (i == 1) /* the original process removes the semaphore */
if (remove_semaphore(semid) == -1)
fprintf(stderr, "[%ld], could not delete semaphore - %s\n",
(long)getpid(), strerror(errno));
return 0;
}
sys_prog.tar.gz_redhat 9
版权申诉
34 浏览量
2022-09-24
12:40:25
上传
评论
收藏 5KB GZ 举报
刘良运
- 粉丝: 66
- 资源: 1万+
最新资源
- 论文(最终)_20240430235101.pdf
- 基于python编写的Keras深度学习框架开发,利用卷积神经网络CNN,快速识别图片并进行分类
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
- 林周瑜-论文.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈