Assume all the variables have been declared previously… because they have been. The child process does not print anything which makes me think it’s not being executed. The parent process runs fine, albeit it doesn’t get the shared memory. I apologize for the length of this code…
// create 5 child process for(int k=0;k<5;k++){ // fork a child process pid = fork(); // error occured on fork if (pid < 0) { fprintf(stderr, 'Fork Failed'); return 1; } // this is what the child process will run else if (pid == 0) { //create a shared mem segment segment_id = shmget(IPC_PRIVATE, size, S_IRUSR | S_IWUSR); //attach the shared memory segment shared_memory = (char *) shmat(segment_id, NULL, 0); printf('this is child'); double x = 0; double sum = 0; // Run process that sums the function for(int i=0; i<n; i++){ // get random number in range of x1-x2 x = rand()%(x2 - x1 + 1) + x1; sum = sum + f(x); } //write output to the shared memory segment sprintf(shared_memory, '%f', sum); execlp('/bin/ls', 'ls', NULL); } // this is what the parent process will run else { //print output from shared memory printf('\n*%s', shared_memory); //detach shared memory shmdt(shared_memory); //Here we add the shared memory to the array // To add together at the end // but since I cant get the memory to share // the array can't be implemented //remove the shared memory segment shmctl(segment_id, IPC_RMID, NULL); wait(NULL); } } // End of for statement
The C stdout stream internally buffers data. It’s likely that your ‘this is child’ message is being buffered, and the buffer isn’t being flushed by execlp, so it just disappears. Try a
fflush(stdout);after the printf. Incidentally, you should do this before thefork()as well, so that child and parent don’t both try to write output buffered from before the fork.