Pagini recente » Cod sursa (job #22008) | Cod sursa (job #1928476) | Cod sursa (job #129410) | Cod sursa (job #2603250) | Cod sursa (job #2278101)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <errno.h>
int main(int argc, char *argv[]) {
char shm_name[] = "myshm";
int shm_fd = shm_open(shm_name, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
if (shm_fd < 0) {
perror(NULL);
return errno;
}
const size_t PER_CHILD = getpagesize();
size_t shm_size = argc * PER_CHILD;
if (ftruncate(shm_fd, shm_size) == -1) {
perror(NULL);
shm_unlink(shm_name);
return errno;
}
int n = argc;
int i;
int offset;
pid_t pid;
printf("Starting parent PID={%d}\n", getpid());
for (i = 1, offset = 0; i < n; i++, offset += PER_CHILD) {
// printf("offset = %d\n", offset);
pid = fork();
if (pid > 0) {
} else if (pid == 0) {
int *shm_ptr = mmap(0, PER_CHILD, PROT_WRITE, MAP_SHARED, shm_fd, offset);
if (shm_ptr == MAP_FAILED) {
perror(NULL);
shm_unlink(shm_name);
return errno;
}
int j;
int x = atoi(argv[i]);
shm_ptr[0] = x;
for (j = 1; x != 1; ++j) {
if (x % 2 == 0) {
x /= 2;
} else {
x = 3 * x + 1;
}
shm_ptr[j] = x;
}
shm_ptr[j] = 1;
printf("DONE! My PID={%d}, Parent PID={%d}\n", getpid(), getppid());
if (munmap(shm_ptr, PER_CHILD) == -1) {
perror(NULL);
shm_unlink(shm_name);
return errno;
}
exit(0);
} else if (pid < 0) {
printf("parent says: fork() failed\n");
}
}
for (i = 1; i <= n; ++i) {
wait(NULL);
}
for (i = 1, offset = 0; i < n; ++i, offset += PER_CHILD) {
int *shm_ptr = mmap(0, PER_CHILD, PROT_READ, MAP_SHARED, shm_fd, offset);
if (shm_ptr == MAP_FAILED) {
perror(NULL);
shm_unlink(shm_name);
return errno;
}
int j = 0;
printf("%d: ", atoi(argv[i]));
while (shm_ptr[j] != 1) {
printf("%d ", shm_ptr[j]);
++j;
}
printf("1\n");
if (munmap(shm_ptr, PER_CHILD) == -1) {
perror(NULL);
shm_unlink(shm_name);
return errno;
}
}
shm_unlink(shm_name);
printf("DONE! My PID={%d}, Parent PID={%d}\n", getpid(), getppid());
return 0;
}