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.

Original source