javabeginner
javabeginner

Reputation: 41

Issue passing optional parameters into C execlp()

I'm writing a C program that uses execlp() to run the linux command-line tool, convert. This command takes optional arguments. However, when using it with execlp(), my C program doesn't recognize the flags I pass in and thus doesn't do the command properly.

For example, if I were to run this command in terminal convert -resize 10% src.jpg dst.jpg it will resize the src image by 10%, saving it to dst. However when I run my C program with this code

rc = execlp("convert", "-resize 10%", src, dst, NULL);

my computer doesn't recognize the resize -10% flag and doesn't do anything to my source image. Why is that?

Upvotes: 2

Views: 451

Answers (2)

Jonathan Leffler
Jonathan Leffler

Reputation: 753605

Most likely, the -resize should be one option and 10% should be another:

rc = execlp("convert", "convert", "-resize", "10%", src, dst, NULL);

Using execlp() is a bad idea if you have variable numbers of arguments — use execvp() instead, building an array of arguments terminated by a null pointer. Use execlp() only when the argument list is fixed.

char *args[6];
int i = 0;
args[i++] = "convert";
args[i++] = "-resize";
args[i++] = "10%";
args[i++] = src;
args[i++] = dst;
args[i++] = NULL;

rc = execvp(args[0], args);

Note that this formula ensures that the program name is passed correctly — once as a string that is searched for on $PATH, and once as the argv[0] of the executed program.

With execlp(), as dbush notes, you have to repeat the command name — once to specify the executable and once to specify the value for argv[0].

Note too that there is nothing to stop you from telling the program via argv[0] that it has a wholly different name from the name that you execute. This rarely happens (shells don't do it) but when you write the code yourself, it is possible.

Upvotes: 0

dbush
dbush

Reputation: 223719

By convention, the first parameter to a process (accessible as argv[0]) is the name of the process. You haven't included that, so "-resize 10%" is read as the process name instead of an option.

Also, "-resize 10%" is actually two parameters separated by a space, so you need to split them up.

rc = execlp("convert", "convert", "-resize", "10%", src, dst, NULL);

Upvotes: 5

Related Questions