Хорошо, лучше соберите ответ вместо этого ...
Есть несколько проблем с вашей программой. Если вы включите предупреждения при сборке (я использую -Wall -Wextra
), многие из них будут совершенно очевидны.
Первые две проблемы, которые я уже упоминал в своих комментариях, но я объясняю их здесь:
- Первый вызов
wait()
. В C или POSIX нет функции wait
, которая не принимает аргументов.
- Вторая проблема - это вызов
scanf
, вы вызываете его с помощью *++
, где *n
принимает значение памяти, на которую указывает n
, что, скорее всего, может привести к авария Снимите звездочку.
- Третья проблема заключается в том, что вы используете общую память как массив целых чисел (с
n
) и как строку. Вы не можете сделать и то и другое, выберите одно или другое.
- Вы создаете общую память в родительском процессе, но дождитесь завершения дочернего процесса, прежде чем создавать память.
- Между родителем и дочерним процессом существует условие состязания, поскольку общая память может быть создана после того, как дочерний процесс попытается получить к ней доступ.
Редактировать Вместо этого я придумал, что, похоже, работает для меня. Я добавил комментарии на вещи, которые я изменил.
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <sys/wait.h> /* Needed for the wait function */
#include <unistd.h> /* needed for the fork function */
#include <string.h> /* needed for the strcat function */
#define SHMSIZE 27
int main() {
int shmid;
char *shm;
if(fork() == 0) {
shmid = shmget(2009, SHMSIZE, 0);
shm = shmat(shmid, 0, 0);
char *s = (char *) shm;
*s = '\0'; /* Set first location to string terminator, for later append */
int i;
for(i=0; i<5; i++) {
int n; /* Variable to get the number into */
printf("Enter number<%i>: ", i);
scanf("%d", &n);
sprintf(s, "%s%d", s, n); /* Append number to string */
}
strcat(s, "\n"); /* Append newline */
printf ("Child wrote <%s>\n",shm);
shmdt(shm);
}
else {
/* Variable s removed, it wasn't used */
/* Removed first call to wait as it held up parent process */
shmid = shmget(2009, SHMSIZE, 0666 | IPC_CREAT);
shm = shmat(shmid, 0, 0);
wait(NULL);
printf ("Parent reads <%s>\n",shm) ;
shmdt(shm);
shmctl(shmid, IPC_RMID, NULL);
}
return 0;
}
Обратите внимание, что пункт 5 в списке выше не был решен.