Программа на си,задание такое:1 процесс открывает файл порождает 2 процесс.Один из них записывает 1 байт в файл подает сигнал другому,второй читает и выводит на экран.Повторить N(у меня 6) циклов запись\чтение.
Проблема:скажите что не так в моем коде?Оно вводит в файл 012345,но выводит на консоль(cygwin,в прикрепленных скрин консоли) -1 шесть раз.
Программа:#include
#include
#include
int main(void) {
FILE *fp;
char name[] = "f.txt";//открытие файла
if ((fp = fopen(name, "w+")) == NULL)
{
printf("Не удалось открыть файл");
return 0;
}
char message = '1';//1 байт
char ch;
int pid = fork();
if (pid < 0) {
printf("Error in fork\n");
return -1;
}
for (int i = 0; i < 6; ++i) //6 ,цикл
{
if (pid > 0) {
raise(SIGSTOP);
fprintf(fp,"%d\n",i);
fflush(fp);
kill(pid, SIGCONT);
} else {
ch = fgetc(fp);
printf("\r%d\n",ch);//вывод на консоль
fflush(NULL);
kill(getppid(), SIGCONT);
raise(SIGSTOP);
}
}
fclose(fp);
return 0;
}
n = 20; { размер массивов }
p=0; { минимальное значение элемента }
q=15; { максимальное значение элемента }
type
V=array[1..n] of integer;
procedure VInit(var a:V; s:string);
{ процедура заполняет элементы массива a
случайными значениями из интервала [p;q].
Элементы сформированного массива выводятся
с заголовком, в который добавляется значение s }
var
i,kol:integer;
begin
kol:=q-p+1;
Writeln('Элементы массива ',s);
for i:=1 to n do
begin a[i]:=Random(kol)+p; Write(a[i],' ') end;
Writeln
end;
procedure SortBubble(var a:V);
{ сортировка методом пузырька }
var
i,j,t:integer;
begin
for i := 1 to n-1 do
for j := 1 to n-i do
if a[j] > a[j+1] then
begin t := a[j]; a[j] := a[j+1]; a[j+1] := t end
end;
procedure VOut(var a:V;s:string);
{ Элементы массива a выводятся с заголовком s }
var
i:integer;
begin
Writeln(s);
for i:=1 to n do Write(a[i],' ');
Writeln
end;
function BinSearch(var a:V;key:integer):boolean;
{ двоичный поиск элемента со значением key в массиве a
Возвращает true, если элемент найден и false, если нет }
var
li,ri,mi:integer;
begin
li:=1; ri:=n;
while li<ri do begin
mi:=(li+ri) div 2;
if a[mi]<key then li:=mi+1 else ri:=mi;
end;
BinSearch:=(a[ri]=key)
end;
var
a,b,c:V;
i,ai1,s:integer;
found:boolean;
begin
Randomize;
VInit(a,'A'); SortBubble(a); VOut(a,'Отсортированный массив A');
VInit(b,'B'); SortBubble(b); VOut(b,'Отсортированный массив B');
VInit(c,'C'); SortBubble(c); VOut(c,'Отсортированный массив C');
s:=0; found:=false;
for i:=1 to n do
begin
if found then
if a[i]=ai1 then Inc(s,ai1)
else found:=false;
if not found then begin
found:=BinSearch(b,a[i]);
if found then found:=BinSearch(c,a[i]);
if found then begin ai1:=a[i]; Inc(s,ai1) end
end
end;
Writeln('Искомая сумма равна ',s);
end.
Тестовое решение:
Элементы массива A
4 10 6 4 12 5 5 15 0 14 2 2 0 3 14 1 11 13 3 9
Отсортированный массив A
0 0 1 2 2 3 3 4 4 5 5 6 9 10 11 12 13 14 14 15
Элементы массива B
7 3 13 3 10 11 3 15 12 10 0 5 5 15 13 1 15 9 1 5
Отсортированный массив B
0 1 1 3 3 3 5 5 5 7 9 10 10 11 12 13 13 15 15 15
Элементы массива C
4 10 5 8 14 15 8 14 12 4 12 12 3 11 4 0 12 2 10 0
Отсортированный массив C
0 0 2 3 4 4 4 5 8 8 10 10 11 12 12 12 12 14 14 15
Искомая сумма равна 64
n=10;m=7;
var
a:array[1..n,1..m]of integer;
i,j,min,s,j_m:integer;
begin
for i:=1 to n do
begin
writeln;
for j:=1 to m do
begin
a[i,j]:=random(20)-5;
write(a[i,j]:4);
end;
end;
writeln;
{запишем в min чуть больше наибольшего значения суммы, которая может быть в любом столбце. Больше, чем 200 не будет, т.к. всего 10 строк, каждое значение исходя из заполнения матрицы не может быть больше, чем 15 }
min:=200;j_m:=1;
for j:=1 to m do
begin
s:=0;
for i:=1 to n do
s:=s+a[i,j];
if s<min then
begin
j_m:=j;
min:=s;
end;
writeln('j :',j,' ',s); {выводится значение суммы в каждом столбце, необязательно, можно удалить}
end;
writeln('№ столбца с мин суммой ',j_m);
for i:=1 to n do
writeln(a[i,j_m]); {вывод нужного столбца}
end.