Question

I'm trying to execute a UNIX command via my program that will handle up to 4 arguments, why does this either produce a seg fault or other errors?

using namespace std;

int main() {

char buffer[255];
cin >> buffer;


char* firstPtr;
char* secondPtr;
char* thirdPtr;
char* fourthPtr;

firstPtr = strtok(buffer, " ");
secondPtr = strtok(NULL, " ");
thirdPtr = strtok(NULL, " ");
fourthPtr = strtok(NULL, " ");


execlp(firstPtr, secondPtr);


   return 0;
}
Was it helpful?

Solution

The crash is because your buffer overflows.

Try to use std::cin.getline(buffer, sizeof(buffer)) instead of std::cin >> buffer
Also note that strtok may return NULL, so be sure you handle it.

OTHER TIPS

I think you should use

char buffer[255];
cin.getline(buffer, 255);

Otherwise your second, third and fourth pointer will be empty.

If you check the man page of execlp, you will notice that the first argument (the second parameter to the method, the arg0 parameter) is mandatory, in addition to any other parameters you might pass to the function via variadic parameters - and it is also mentioned in the text that

The list of arguments must be terminated by a NULL pointer.

The first argument (secondPtr in your case) should be the name of the executable; so you're violating the convention by passing in NULL here (because of the cin >> others have pointed out already).

But in addition, you're also missing at least one more argument at the end which needs to be NULL.

So, a study of man pages is highly recommended!

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top