#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
extern int A;
int SHMID;
int *a;
void proces(int i, int increase){
a[i] = i;
A+=increase;
}
int main(int argc, char *argv[]){
int N, M, i;
N=atoi(argv[0]);
M=atoi(argv[1]);
A = 0;
SHMID = shmget(IPC_PRIVATE, sizeof(int)*N, 0600);
if(SHMID == -1){
exit(1);
}
a = (int *)shmat(SHMID, NULL, 0);
for(i=0; i<N; i++){
if(fork() == 0){
proces(i, M);
exit(0);
}
}
for(i=0; i<N; i++)
wait(NULL);
printf("A = %d\n", A);
shmdt((char *)a);
shmctl(SHMID, IPC_RMID, NULL);
return 0;
}
Задача такова: «Написать две программы - одну, которая создает N новых потоков, и другую, которая создает N новых процессов.
Каждый поток или каждый процесс увеличивает общую переменную A M раз. Параметры N и M задаются в качестве аргумента из командной строки.
Основная программа, то есть основной поток / процесс, сначала устанавливает нулевое начальное значение переменной A, затем создает число потоков / процессов по умолчанию, а после завершения всех потоков / процессов выводится окончательное значение переменной A ".
Я уже написал первую программу для создания N потоков, но у меня возникли проблемы с кодированием второй программы для создания N процессов (описанной выше). Задача гласит, что переменная A должна быть общей для обеих программ . Моя интерпретация заключается в том, что я должен объявить переменную A в первой программе как глобальную переменную, а затем объявить ее так же во второй программе, но с добавлением модификатора extern в объявлении. Ошибка, которую я получаю при компиляции второй программы:
В функции proces':
procesi.c:(.text+0x25): undefined reference to
A '
processi.c :(. text + 0x30): неопределенная ссылка на A'
/tmp/cc2mFZ94.o: In function
main ':
processi.c :(. text + 0x70): неопределенная ссылка на A'
procesi.c:(.text+0x124): undefined reference to
A '
collect2: ошибка: ld вернул 1 статус выхода