LINUX.ORG.RU

IPC не компилируется


0

0

Программа увеличивает счетчик в отображаемом в память файле. (QNX 6.3.0)
#include <unistd.h>
#include <semaphore.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <sys/mman.h>
#define MAXLINE 4096
#define FILE_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)
#define SEM_NAME "mysem"

struct shared {
 sem_t mutex; /* the mutex: a Posix memory-based semaphore */
 int count;		/* and the counter */
} shared;

int main(int argc, char **argv)
{
	int fd, i, nloop;
	struct shared  *ptr;
	if (argc != 3)
		printf("usage: incr3 <pathname> <#loops>");
	nloop = atoi(argv[2]);
		/* 4open file, initialize to 0, map into memory */
	fd = open(argv[1], O_RDWR | O_CREAT, FILE_MODE);
	write(fd, &shared, sizeof(struct shared));
	ptr = mmap(NULL, sizeof(struct shared), PROT_READ | PROT_WRITE,
			   MAP_SHARED, fd, 0);
	close(fd);
		/* 4initialize semaphore that is shared between processes */
	sem_init(&ptr->mutex, 1, 1);
	setbuf(stdout, NULL);	/* stdout is unbuffered */
	if (fork() == 0) {		/* child */
		for (i = 0; i < nloop; i++) {
			sem_wait(&ptr->mutex);
			printf("child: %d\n", ptr->count++);
			sem_post(&ptr->mutex);
		}
		exit(0);
	}
		/* 4parent */
	for (i = 0; i < nloop; i++) {
		sem_wait(&ptr->mutex);
		printf("parent: %d\n", ptr->count++);
		sem_post(&ptr->mutex);
	}
	exit(0);
}


Компилируется без ошибок. При запуске выдает: "Memory fault (core dumped)".
Как исправить?
Не нравятся ему скорей всего строки:
sem_wait(&ptr->mutex);
printf("child: %d\n", ptr->count++);
За раннее благодарен
anonymous

Правильно вылетает. Ты наверняка прогу без параметров запускаешь? Вот и получи сегфолт.

Как вариант сделай вот что:

if (argc != 3)
{
  printf("usage: incr3 <pathname> <#loops>\n");
  exit (0);
}

alxndr
()
Ответ на: комментарий от anonymous

Тогда - отладка, отладка и еще раз отладка :) Лично у меня выдает следующее :

tt> ./a.out d.bin 5 child: 0 child: 1 child: 2 child: 3 child: 4 parent: 5 parent: 6 parent: 7 parent: 8 parent: 9

alxndr
()
Ответ на: комментарий от anonymous

Тогда - отладка, отладка и еще раз отладка :)
Лично у меня выдает следующее :

tt> ./a.out d.bin 5
child: 0
child: 1
child: 2
child: 3
child: 4
parent: 5
parent: 6
parent: 7
parent: 8
parent: 9

alxndr
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.