[Beowulf] Seg Fault with pvm_upkstr() and Linux.

Josh Zamor jzamor at gmail.com
Wed Mar 16 12:14:52 PST 2005


On Mar 16, 2005, at 7:30 AM, Robert G. Brown wrote:

> I assume that you've experimented and have no difficulty returning and
> unpacking ordinary ints, strings, or raw data blocks with PVM.  If so
> you probably aren't making a pointer error on the master server side,
> although it never hurts to check.

Actually, I had tried passing ints and the like in other programs and 
had no problem, but when I tired to pass just a string in my factorial 
program, not using GMP, but still having the GMP library, it would 
segfault. What I hadn't tried was to create a simple test program for 
just sending strings using PVM. I have now written a test program that 
does not use the GMP and tries to send a basic string back from a child 
to the parent. This again will segfault on the linux machine and work 
just fine on the OSX machine (essentially BSD). The code that I tried 
is posted below. For convenience I have also posted the source of this 
test program, my simple factorial program, Makefiles, and script 
outputs from both OSX and the linux machine at the following address:   
http://www.cet.nau.edu/~jrz4/pvmTest/

--strPVM.c--

#include <pvm3.h>
#include <stdio.h>

int main(int argc, char** argv) {
     int info, mytid, myparent, child[2];

     if(mytid = pvm_mytid() < 0) {
	pvm_perror("Could not get mytid");
	return -1;
     }

     myparent = pvm_parent();
     if((myparent < 0) && (myparent != PvmNoParent)) {
	pvm_perror("Some odd errr for my parent");
	pvm_exit();
	return -1;
     }

     /* I am parent */
     if(myparent == PvmNoParent) {
	info = pvm_spawn(argv[0], NULL, PvmTaskDefault, NULL, 2, child);

	for(int i = 0; i < 2; ++i) {
	    if(child[i] < 0)
		printf(" %d", child[i]);
	    else
		printf("t%x\t", child[i]);
	}
	putchar('\n');

	if(info != 2) {
	    pvm_perror("Kids didn't all spawn!");
	    pvm_exit();
	    return -1;
	}

	for(int i = 0; i < 2; ++i) {
	    char* retStr;
	    info = pvm_recv(-1, 11);
	    info = pvm_upkstr(retStr);
	    printf("Recieved return string: %s\n", retStr);
	}

	pvm_exit();
	return 0;
     } else { /* Child follows */
	char str[3];
	str[0] = 'a';
	str[1] = 'b';
	str[3] = (char)0;
	pvm_initsend(PvmDataDefault);
	pvm_pkstr(str);
	pvm_send(myparent, 11);
	pvm_exit();
	return 0;
     }
}

Also, for the character array "str" in the child segment above, I have 
tried using malloc to create the memory, and using const char arrays as 
well. While all of these methods give seg faults on the linux machine, 
the above way was the only way that I tried that worked and didn't give 
a bus error on Mac OSX.

Thanks again.




More information about the Beowulf mailing list