Reputation: 41
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
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
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