-
February 27th, 2012, 06:11 PM
#1
[RESOLVED] Segmentation fault and can't figure out why
It seems to be going null. I can't get a null value, I want it to accept input till the user hits enter with no text typed. I've tried checking to see if the input is NULL, "", and "\n" all to no avail.
Code:
#include <stdio.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <iostream>
#include <fstream>
#include <string.h>
#include <cstring>
using namespace std;
int main()
{
string info = "";
cout << "Enter some info. \n";
int counter;
string newInfo = "";
counter = 0;
cout << counter;
bool noMore = false;
while(noMore == false)
{ // begin while
if (counter == 0)
{ // begin if
getline(cin, info);
cout << info.c_str();
if (info.c_str() == "")
{ // begin if
cout << "Went here.";
noMore = true;
} // end if
else
counter++;
} // end if
else
{ // begin else
getline(cin, newInfo);
cout << newInfo.c_str();
if (newInfo.c_str() == "")
{ // begin if
noMore = true;
} // end if
else
{ // begin else
info = info + "\n" + newInfo;
counter++;
} // end else
} // end else
} // end while
if (info.c_str() == "\n")
{
cout << "Abnormal termination.";
return 1;
}
/* the identifier for the shared memory segment */
int segment_id;
/* a pointer to the shared memory segment */
char *shared_memory;
/* the size (in bytes) of the shared memory segment */
const int size = 4096;
/* allocate a shared memory segment */
segment_id = shmget(IPC_PRIVATE, size, S_IRUSR | S_IWUSR);
/* attach the shared memory segment */
shared_memory = (char *) shmat(segment_id, NULL, 0);
/* write a message to the shared memory segment */
sprintf(shared_memory, info.c_str());
/* now print out the string from shared memory */
printf("*%s\n", shared_memory);
printf("*%s\n", segment_id);
/* now detach the shared memory segment */
shmdt(shared_memory);
return 0;
}
-
February 27th, 2012, 06:30 PM
#2
Re: Segmentation fault and can't figure out why
This will not do what you think it does. Try:
or just
The c_str() call is also unnecessary for cout.
-
February 27th, 2012, 06:58 PM
#3
Re: Segmentation fault and can't figure out why
I did and it's still giving a segmentation fault.
What is wrong with this line:
printf("*%s\n", shared_memory);
Last edited by jedipenguin; February 27th, 2012 at 07:01 PM.
-
February 27th, 2012, 07:05 PM
#4
Re: Segmentation fault and can't figure out why
I'm not very familiar with shared memory operations. Just to confirm, though, you did make those changes I suggested throughout the code, not just at that one line, right?
-
February 27th, 2012, 07:09 PM
#5
Re: Segmentation fault and can't figure out why
Originally Posted by Lindley
I'm not very familiar with shared memory operations. Just to confirm, though, you did make those changes I suggested throughout the code, not just at that one line, right?
Yes, I think so. It's getting down to that line I just pointed out. My couts are outputting till it reaches that point.
I'm wondering, though the book has a printf() in it's example, if I should change it to a cout or something.
I'm going to see if shared_memory is somehow NULL.
Why is it going to the if block in the while loop and assuming that I entered nothing. It's outputting, "Went here." even when the first time I enter something other than a newline.
Never mind on that. It's going through the loop I think. It's because of my spacing. I didn't see that it said "I went here." However, I don't know why it's going NULL or whatever is going wrong.
Is it something with my shared_memory variable?
Last edited by jedipenguin; February 27th, 2012 at 07:15 PM.
-
February 27th, 2012, 07:22 PM
#6
Re: Segmentation fault and can't figure out why
Originally Posted by jedipenguin
Yes, I think so. It's getting down to that line I just pointed out. My couts are outputting till it reaches that point.
You don't check any of those functions to see if they returned a success code. You just assume they work, which is not correct.
http://pubs.opengroup.org/onlinepubs...ns/shmget.html
From the link above:
RETURN VALUE
Upon successful completion, shmget() shall return a non-negative integer, namely a shared memory identifier; otherwise, it shall return -1 and set errno to indicate the error.
Where is your check to see what shmget() returns? Not only this function, but all the other functions such as shmat -- where do you check for error values?
http://linux.die.net/man/2/shmat
Please read the documentation for your functions, and especially the section that describes error codes if a failure occurs.
The reason why your program crashes is that you're attempting to dereference an invalid address. You can't call printf() on a pointer that is pointing to garbage -- the results will be unpredicatable.
Regards,
Paul McKenzie
Last edited by Paul McKenzie; February 27th, 2012 at 07:26 PM.
-
February 27th, 2012, 07:51 PM
#7
Re: Segmentation fault and can't figure out why
Originally Posted by Paul McKenzie
You don't check any of those functions to see if they returned a success code. You just assume they work, which is not correct.
http://pubs.opengroup.org/onlinepubs...ns/shmget.html
From the link above:
Where is your check to see what shmget() returns? Not only this function, but all the other functions such as shmat -- where do you check for error values?
http://linux.die.net/man/2/shmat
Please read the documentation for your functions, and especially the section that describes error codes if a failure occurs.
The reason why your program crashes is that you're attempting to dereference an invalid address. You can't call printf() on a pointer that is pointing to garbage -- the results will be unpredicatable.
Regards,
Paul McKenzie
segment_id = shmget(IPC_PRIVATE, size, S_IRUSR | S_IWUSR);
cout << "Segment id is : " << segment_id << "\n";
It gave me: 4456489
I had to change my printf()s to couts to make it stop the segmentation fault.
It successfully wrote to the shared memory because when I had another program read from it, it got all the data.
However, why was my printf going wrong? Was it a bad formatting for the first argument to the method?
-
February 27th, 2012, 08:43 PM
#8
Re: Segmentation fault and can't figure out why
Originally Posted by jedipenguin
segment_id = shmget(IPC_PRIVATE, size, S_IRUSR | S_IWUSR);
cout << "Segment id is : " << segment_id << "\n";
It gave me: 4456489
Did you make those checks an integral part of your program, and not just "cout" some value? What if the value is -1, what do you do? It may not be -1 now, but run it on another machine, and what if it is -1? Do you halt the program?
Error checking and handling are supposed to be integrated into your program.
I had to change my printf()s to couts to make it stop the segmentation fault.
Code:
printf("*%s\n", segment_id);
What variable type is segment_id? Isn't it an int? So why are you fooling printf() into believing that segment_id is a NULL terminated string? That's why printf() crashes -- your variable type does not match the format specfier. The reason why cout works is that cout doesn't use this technique of format strings to print variables, i.e. cout is type-safe. With printf(), if your variable doesn't match the format specifier, the results are unpredictable.
Regards,
Paul McKenzie
Last edited by Paul McKenzie; February 27th, 2012 at 08:47 PM.
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|