I do not understand how execlp() works in Linux
c, exec, linux
Solution
this prototype:
int execlp(const char *file, const char *arg, ...);
Says that execlp ìs a variable argument function. It takes 2 `const char *`. The rest of the arguments, if any, are the additional arguments to hand over to program we want to run - also `char *` - all these are C strings (and the last argument must be a NULL pointer)
So, the `file` argument is the path name of an executable file to be executed. `arg` is the string we want to appear as `argv[0]` in the executable. By convention, `argv[0]` is just the file name of the executable, normally it's set to the same as `file`.
The `...` are now the additional arguments to give to the executable.
Say you run this from a commandline/shell:
$ ls
That'd be `execlp("ls", "ls", (char *)NULL);` Or if you run
$ ls -l /
That'd be `execlp("ls", "ls", "-l", "/", (char *)NULL);`
So on to `execlp("/bin/sh", ..., "ls -l /bin/??", ...);`
Here you are going to the shell, /bin/sh , and you're giving the shell a command to execute. That command is "ls -l /bin/??". You can run that manually from a commandline/shell:
$ ls -l /bin/??
Now, how do you run a shell and tell it to execute a command ? You open up the documentation/man page for your shell and read it.
What you want to run is:
$ /bin/sh -c "ls -l /bin/??"
This becomes
execlp("/bin/sh","/bin/sh", "-c", "ls -l /bin/??", (char *)NULL);
Side note: The `/bin/??` is doing pattern matching, this pattern matching is done by the shell, and it expands to all files under /bin/ with 2 characters. If you simply did
execlp("ls","ls", "-l", "/bin/??", (char *)NULL);
Probably nothing would happen (unless there's a file actually named `/bin/??`) as there's no shell that interprets and expands /bin/??
Problem
I have spent the last 2 days trying to understand the `execlp()` system call, but yet here I am. Let me get straight to the issue. The `man page` of execlp declares the system call as `int execlp(const char *file, const char *arg, ...);` with the description: The const char arg and subsequent ellipses in the execl(), execlp(), and execle() functions can be thought of as arg0, arg1, ..., argn. Yet I see the system call being called like this in our text book: `execlp(“/bin/sh”, ..., “ls -l /bin/??”, ...);` (the "..." are for us to figure out as students). However this system call doesn´t even resemble anything like the declaration on the `man page` of the system call. I am super confused. Any help is appreciated.