Синхронизация в C с системными вызовами - PullRequest
0 голосов
/ 10 февраля 2011

Я делаю что-то немного странное, но я хочу, чтобы это было полностью синхронизировано. Так что я подумал о вашей помощи. У меня есть следующее:

printf("My name is:");
system("echo syntax_Error");
printf("I am 17 yrs old\n");

это довольно абстрактно, а не эхо. Я запускаю программное обеспечение, которое дает мне вывод, поэтому время выполнения непредсказуемо, но порядок тот же. Я хочу printf, затем системный вызов, а затем printf, чтобы они выровнялись как таковые

Меня зовут синтаксис_Ошибка Мне 17 лет старый \ п

Я попробовал этот порядок без блокировок, но он не сработал, что вполне очевидно, или, если оно сработало, иногда непредсказуемо. Я новичок в структурах синхронизации, поэтому я хотел бы получить ваш вклад.

ура! =)

Ответы [ 3 ]

2 голосов
/ 10 февраля 2011

Если вы думаете о многопоточности и взаимном исключении (синхронизации) в C, посмотрите на потоки POSIX.(man pthread).

Как уже говорили другие, приведите свои строки в правильный порядок.Если вы работаете в ОС с 'echo', которая поддерживает -n (без новой строки), это делает то, что вам нужно.

#include <stdio.h>

int main(int argc, char *argv[]) {

printf("My name is:");
fflush(stdout);
system("/bin/echo -n syntax_Error");
printf("I am 17 yrs old\n");
fflush(stdout);

}

$ cc     main.c   -o main
$ ./main
My name is:syntax_ErrorI am 17 yrs old

Вместо того, чтобы просто использовать 'system', посмотрите также 'execve' и т. Д. 'Man execve'

2 голосов
/ 10 февраля 2011

Возможно, вам потребуется явно очистить выходной буфер с помощью fflush(stdout) после первого вызова printf. Вызов system порождает новый процесс, который имеет свою собственную буферизацию. В конце концов этот процесс завершается и очищает свой буфер, но буфер родительского процесса совершенно не связан.

Стоит отметить, что большинство реализаций libc будут сбрасываться автоматически при каждом появлении символа новой строки, поэтому вызов fflush будет ненужным, если в конце первого сообщения будет символ новой строки.

0 голосов
/ 10 февраля 2011

Если вы хотите использовать объекты синхронизации, вам нужно найти способ заставить этот вызов system использовать их тоже. Это, вероятно, будет означать написание другой программы, а не использование echo. Вроде грязный.

Вероятно, более разумный способ справиться с этим - использовать один и тот же метод для вывода на консоль (все вызовы system или все printf с) или выбрать один из них для вывода в файл журнала консоли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...