【发布时间】:2019-09-05 01:09:55
【问题描述】:
我正在尝试了解如何使用信号量。我一直在编写代码,其中一个进程在受控循环中执行多个子进程。我想实现孩子使用信号量锁访问资源。每当我写东西时,我都会遇到分段错误(核心转储)问题。每当我寻求帮助时,我都会找到一个没有很好解释的实现。这是我现在写的内容
在主程序中:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
#include<sys/wait.h>
#define key 0x10101010
int main(int * argc, char * argv[])
{
int i,count=0;
pid_t pid;
int status;
int *scount;
int shmid;
shmid = shmget(key,sizeof(int),IPC_CREAT | 0666);
if(shmid == -1)
{
perror("\n SHM Error");
}
scount = shmat(shmid,0,0);
scount = 0;
for(i = 0;i<10;i++)
{
pid = fork();
if(pid < 0){
perror("\nFork error\n");
}
else if(pid == 0){
execlp("./child","./child",NULL);
exit(0);
}
}
for(i =0;i<10;i++)
{
if(pid > 0){
wait(pid);
//printf("\nI am parent and my PID %d",getppid());
}
}
printf("\nTotal number of processes forked are %d\n",*scount);
sem_unlink("./semakey123");
return 0;
}
在子进程中:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<semaphore.h>
#define key 0x10101010
#define semkey 0x91919191
int main(int *argc, char *argv[])
{
int shmid,semid;
int *count;
sem_t *sem;
sem = sem_open("./semakey123",IPC_CREAT |0666);
sem_init(sem,0,0);
if(sem = SEM_FAILED)
perror("\n Semaphore not opened");
shmid = shmget(key,sizeof(int), IPC_CREAT | 0666);
if(shmid ==-1)
{
perror("\n SHM Error");
}
else printf("\n SHM attached to CHild");
count = shmat(shmid,0,0);
printf("\nEntering Critical section");
sem_wait(sem);
sleep(3);
*count+=1;
printf("\n Count: %d\n",*count);
sleep(2);
printf("\nExiting critical section");
sem_post(sem);
return 0;
}
当我注释信号量相关代码时,共享内存中的 Count 超出了限制。程序在没有进入无限循环的情况下终止,但仍发生在核心转储处。在未注释信号量代码的情况下,我立即得到分段错误。任何帮助表示赞赏。
P.S:我不是编程初学者,但我是系统编程初学者。
【问题讨论】:
标签: c linux operating-system fork semaphore