Pagini recente » Cod sursa (job #248155) | Cod sursa (job #1019140) | Cod sursa (job #2038579) | Cod sursa (job #2303497) | Cod sursa (job #2489172)
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <string.h>
int a2i(const char *s)
{
int n = 0;
while (*s)
{
n = ( (*s) - '0') + n * 10;
s++;
}
return n;
}
int main(int argc, char const *argv[])
{
pid_t pid;
char shm_name[] = "myshm";
int shm_fd;
size_t shm_size = 1000 * getpagesize();
// create shared memory object
shm_fd = shm_open(shm_name, O_CREAT|O_RDWR, S_IRUSR|S_IWUSR);
if (shm_fd < 0) {
perror(NULL);
return errno;
}
// define size of shared memory object
if (ftruncate(shm_fd, shm_size) == -1) {
perror(NULL);
shm_unlink(shm_name);
}
for (int i = 1; i < argc; i++) {
int nr = a2i(argv[i]);
// create process
pid = fork();
if (pid < 0) {
return errno;
}
else if (pid == 0) {
char buff[getpagesize()];
void* shmptr = mmap(0, getpagesize(), PROT_WRITE, MAP_SHARED, shm_fd, (i - 1) * getpagesize());
if (shmptr == MAP_FAILED) {
perror(NULL);
shm_unlink(shm_name);
return errno;
}
while(nr != 1) {
char nr_char[10];
sprintf(nr_char, "%d " , nr);
strcat(buff, nr_char);
if (nr % 2 == 0) {
nr = nr / 2;
} else {
nr = 3 * nr + 1;
}
}
strcat(buff, "1\n");
sprintf(shmptr, "%s", buff);
munmap(shmptr, getpagesize());
printf("Done Parent %d Me %d \n", getppid(), getpid());
exit(0);
}
}
for (int i = 1; i < argc; i++) {
wait(NULL);
}
for (int i = 1; i < argc; i++) {
char* shmptr = mmap(0, getpagesize(), PROT_READ, MAP_SHARED, shm_fd, (i - 1) * getpagesize());
if (shmptr == MAP_FAILED) {
perror(NULL);
shm_unlink(shm_name);
return errno;
}
printf("%s", shmptr);
munmap(shmptr, getpagesize());
}
shm_unlink(shm_name);
printf("Done Parent %d Me %d\n", getppid(), getpid());
return 0;
}