Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

I do not understand how execlp() works in Linux

Tags:

c

linux

exec

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.

like image 261
Arman Iqbal Avatar asked Feb 04 '14 17:02

Arman Iqbal


People also ask

What does Execlp do in Linux?

Description: The execlp() function replaces the current process image with a new process image specified by file. The new image is constructed from a regular, executable file called the new process image file. No return is made because the calling process image is replaced by the new process image.

What are the arguments passed to Execlp?

The arguments specified by a program with one of the exec functions are passed on to the new process image in the main() arguments. The path argument points to a path name that identifies the new process image file. The file argument is used to construct a pathname that identifies the new process image file.

When you use the Execlp function The function searches for the executable in the?

Use execlp to Execute a New Program Using Filename in C execlp function is the one that gives the user option to specify the filename and the program is searched in directories that are listed the current PATH environment variable.

What does Execlp return?

Description: The execlp() function replaces the current process image with a new process image specified by file . The new image is constructed from a regular, executable file called the new process image file. No return is made because the calling process image is replaced by the new process image.


1 Answers

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/??

like image 155
nos Avatar answered Oct 13 '22 15:10

nos