Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2014, 11:23   #1
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию Процессы и файл

Вобщем, ситуация такая.

Несколько процессов, созданных командой fork (но я думаю, значения это не имеет) выводят информацию на экран.

Все операции вывода нумеруются и номер выводится возле выводимой информации.

Понятно, что стандартный вывод - это разделяемый ресурс и поэтому я огородил его мутексом.

При выводе на экран теперь все окей, но если я пытаюсь перенаправить вывод - получается беда (все перемешивается).

Код:
// мутекс и разделяемая переменная
sem_t *terminal_mutex;  
int *p_actnum;

void outmsg(char *msg) {
	sem_wait(terminal_mutex);
	
	printf("%d:%s", *p_actnum, msg);
	(*p_actnum)++;
	
	sem_post(terminal_mutex);
}

// ...
int main() {
//...
	if ((terminal_mutex = sem_open("terminal_mutex", O_CREAT|O_EXCL, 0644, 1)) == SEM_FAILED) 
		exit(2);
	
	int actnum_shmid = shmget(SHM_ACTNUM, sizeof(int), 0666 | IPC_CREAT);
	if (actnum_shmid < 0)
		exit(2);
	
	p_actnum = (int* )shmat(actnum_shmid, (void *)0, 0);
	if (p_actnum == (int *)(-1))
		exit(2);
	
	*p_actnum = 1;
//...
}
Пример того, что получаю в файле после вызова ./main > 1.out
Цитата:
3gh
4:asd
13:fgh
20:rty
А если без перенаправления, то все нормально: ./main
Цитата:
1gh
2:asd
3:fgh
4:rty
Ну примерно так.

Собственно, каким образом перенаправления вывода влияет на синхронизацию вывода мутексом? - или я синхронизирую вообще неверно? - но без синхронизации каша получается при выводе на экран... С мутексом я поборол кашу на экране. Но чем стандартный вывод отличается от файла в плане синхронизации?
rrrFer вне форума Ответить с цитированием
Старый 03.05.2014, 11:26   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Короче, еще я пронумеровал потоки )
И вот вижу, что при перенаправлении сначала в файл помещаются все данные, одного потока, потом другого и т.п.

Т.е. каждый поток пишет данные в "свой файл", а потом они слепляются, выходит?
rrrFer вне форума Ответить с цитированием
Старый 03.05.2014, 11:31   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

короче если все пронумеровать, то выглядит так:
Цитата:
[id op] [id proc]
13:2:
16:2:
19:2:
3:1:
5:1:
20:1
...
Ну и суть в том, что каждый процесс выводит все на свой терминал. Да, они синхронизируются, но терминалы у них разные. А слепляются результаты уже после

Вобщем сам спросил, сам ответил.
rrrFer вне форума Ответить с цитированием
Старый 03.05.2014, 12:50   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

короче если все пронумеровать, то выглядит так:
Цитата:
[id op] [id proc]
13:2:
16:2:
19:2:
3:1:
5:1:
20:1
...
Ну и суть в том, что каждый процесс выводит все на свой терминал. Да, они синхронизируются, но терминалы у них разные. А слепляются результаты уже после

Вобщем сам спросил, сам ответил.
rrrFer вне форума Ответить с цитированием
Старый 03.05.2014, 12:51   #5
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

И все эти fprintf с потоками тоже не работают, вроде как.

Пользовать надо open, write, read
rrrFer вне форума Ответить с цитированием
Старый 03.05.2014, 16:23   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Если пишете одной операцией записи, тогда вам синхронизацию не надо.
Порядок строк вы никакой синхронизацией не решите.
Насчет проблем при перенаправлении - сделайте fflush после записи (не выходя из семафора).
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Процессы Arsenx777 Общие вопросы Delphi 2 19.11.2011 20:23
процессы An123 Помощь студентам 0 14.01.2010 21:52
Процессы Bat{CMD}_Men Win Api 5 03.10.2009 12:27
процессы lelik3000 Win Api 2 23.10.2008 09:04
Процессы student_63 Win Api 4 13.04.2008 11:46