关于信号量同步,最后一次写入当前时间进入文件产生阻塞的问题
问题描述:
在练习中,将当前时间写入文件中,但是当写入的记录数超过25时,最后一条信息会不完整,且程序出现阻塞,目前测试是因为卡在了第二次占用SEM_P后,发生阻塞,导致最后一条时间信息结尾不完整,程序也无法正常退出。按照理论在子进程释放SEM_P中的资源后,就可以继续进行,但是不知道为什么就是出现了阻塞。
sem_p(semid, SEM_P);
//sprintf(buf, ">\n");
fwrite(">\n", 1, 2, fp);
fflush(fp);
sem_v(semid, SEM_P);程序的相关代码:
sem.h
#ifndef __SEM__H__ #define __SEM__H__ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> // 创建信号类列表 extern int sem_creat(int nums, unsigned short value[]); // 占用资源 extern int sem_p(int semid, int num); // 释放资源 extern int sem_v(int semid, int num); // 删除信号量列表 extern int sem_del(int semid); // 获取信号量的资源个数 extern int get_val(int semid, int num); #endif
sem.c
#include "sem.h"
#define SEM_PATHNAME "."
#define SEM_PRO_ID 99
union semun
{
unsigned short *arrry;
};
/*
创建信号量列表
@param nums : 信号量列表中的信号个数
@param value : 各个信号量的资源值
@return error : -1, success : semid
*/
int sem_creat(int nums, unsigned short value[])
{
key_t key;
int semid;
key = ftok(SEM_PATHNAME, SEM_PRO_ID);
if( -1 == key )
return -1;
semid = semget(key, nums, IPC_CREAT | 0644);
if( -1 == semid )
return -1;
union semun s;
s.arrry = value;
semctl(semid, 0, SETALL, s);
return semid;
}
/*
占用资源
@param semid : 信号量列表id
@param num : 列表中具体信号量下标
*/
int sem_p(int semid, int num)
{
struct sembuf s;
s.sem_num = num;
s.sem_op = -1;
s.sem_flg = SEM_UNDO;
return semop(semid, &s, 1);
}
/*
释放资源
@param semid : 型号量列表id
@param num : 型号量列表中的具体信号
*/
int sem_v(int semid, int num)
{
struct sembuf s;
s.sem_num = num;
s.sem_op = 1;
s.sem_flg = SEM_UNDO;
return semop(semid, &s, 1);
}
// 删除信号量列表
int sem_del(int semid)
{
return semctl(semid, 0, IPC_RMID, NULL);
}
/*
获取信号量的资源个数
@param semid : 信号量列表id
@param num : 信号量列表中的具体信号量下标
*/
int get_val(int semid, int num)
{
union semun {
int val;
};
union semun s;
return semctl(semid, num, GETVAL, s);
}main.c
#include "sem.h"
#include <unistd.h>
#include <sys/wait.h>
#include <time.h>
#define SEM_P 0
#define SEM_C 1
#define MAX 60 * 1
int main(void)
{
int cpid;
int semid;
unsigned short value[] = {1, 0};
FILE *fp;
semid = sem_creat(2, value);
if( -1 == semid )
{
perror("[ERROR] sem_creat()");
return -1;
}
fp = fopen("./time.txt", "a");
if( NULL == fp )
{
printf("fopen() error.\n");
return -1;
}
cpid = fork();
if( -1 == cpid )
{
perror("[ERROR] fork()");
return -1;
}else if( 0 == cpid ) // 子进程
{
int count = 0;
while( (++count) <= MAX )
{
//sleep(1);
time_t t;
struct tm *info;
time(&t);
info = localtime(&t);
sem_p(semid, SEM_C);
char buf[64];
sprintf(buf, "%d-%d-%d %d:%d:%d", info->tm_year+1900,
info->tm_mon+1,
info->tm_mday,
info->tm_hour,
info->tm_min,
info->tm_sec);
fwrite(buf, 1, strlen(buf), fp);
fflush(fp);
sem_v(semid, SEM_P);
}
fclose(fp);
}else if( cpid > 0 ) // 父进程
{
int count = 0;
while( (++count) <= MAX )
{
sem_p(semid, SEM_P);
char buf[4];
sprintf(buf, "%d,<", count);
fwrite(buf, 1, strlen(buf), fp);
fflush(fp);
sem_v(semid, SEM_C);
sem_p(semid, SEM_P);
//sprintf(buf, ">\n");
fwrite(">\n", 1, 2, fp);
fflush(fp);
sem_v(semid, SEM_P);
sleep(1);
}
wait(NULL);
sem_del(semid);
fclose(fp);
}
return 0;
}相关截图:
当写入60条的时候,程序不能正常退出

当写入20条的时候,程序可以正常退出

11
收起
正在回答 回答被采纳积分+1
相似问题
登录后可查看更多问答,登录/注册
物联网/嵌入式工程师
- 参与学习 394 人
- 提交作业 23775 份
- 解答问题 1206 个
行业热门,政策风口,人才缺口极大,现在入场时机正好! 上千人检验,数轮迭代的硬核知识体系,软硬件通吃 保姆式教学+简历指导+1V1模拟面试+3次内推,助力轻松就业!
了解课程

恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星