Question about execl, replacing process's contents


 
Thread Tools Search this Thread
Top Forums Programming Question about execl, replacing process's contents
# 1  
Old 12-17-2016
Question Question about execl in C, replacing process's contents

I'm reading Operating Systems in Depth by Thomas W. Doeppner, and I have a question about execl. He says it's called after fork(), and that it replaces the text (code) of the current process and replaces it with the code of the new program. But that doesn't make sense to me.

Does that mean process A forks itself and its copy is process B, but process A's code is gone, and in its place is the code from process B?

OR does that mean process A forks itself and its copy is process B; process B loads a program into its text section, and now process B's text section is gone and in its place is the program it loaded?

Edit: I realize I forgot to mention the language the author uses in his examples is C

Last edited by SirSalt; 12-17-2016 at 07:08 PM..
# 2  
Old 12-17-2016
Please note: This is simplified! when you read the man page for exec or fork it goes into lots of technical details. This is how I used to teach this to OS students as a high level peek. Start with a simplified model and then build on it.

Call the parent "A"

After a fork() call you now have two processes, which are identical copies (a little over simplified), A the parent and "B" the child.

If B calls execl() it clears everything out of B's memory, loads new memory and then runs.
You now have two threads of execution, A and B. Otherwise B is running the same code as A see #2 below.

The parent A has three choices:

1. most times it calls wait() to wait until the child ends. It will receive the SIGCHLD signal to let it know the status of the child. Know that the child can write to STDOUT, STDERR, and read from STDIN. The return value of the wait() call tells the parent things went ok or not ok.

2. Parent can chug along doing something else, checking periodically for termination of the child. Usually in this case the child is running a function that the parent called for it to run. Kind of like sending your kid to the store while you cook dinner. This often involves IPC (interprocess communication calls) somewhat like making your kid take a cell phone with her.

3. The parent can call exit(). If the child then calls setsid() it takes over being in charge of things like the existing tty it inherited from the parent. And possibly other objects in memory. Often lots of objects.

#1 is mostly what happens when you run a command.

#2 is what happens when the main process wants to run extra concurrent threads of execution, for example in shell scripts. It is very common on database servers. Used for efficiency usually.
When you learn about shared libraries you will understand one of the main efficiencies of this.

#3 is how to start a daemon - another name for a service like ftpd, which has no connected tty. Note the d on ftpd - means daemon. What you see:After you start a service your connection to the new program terminates and you go back to the command line prompt. You actually forked a child ("B"), which then forked the service process (call it process "C") using the same code as the parent and then the parent "B" died. C never calls setsid() id it wants to run as a detached process like a service. And since "B" died you go back to the command line.

There are variations on this but you now have the basics.

Last edited by jim mcnamara; 12-17-2016 at 08:32 PM..
This User Gave Thanks to jim mcnamara For This Post:
# 3  
Old 12-18-2016
Alright, thank you for clarifying that Smilie

---------- Post updated 12-18-16 at 09:20 PM ---------- Previous update was 12-17-16 at 10:28 PM ----------

As I meditated on what you said, I thought of something. In your #3 explanation, would the tty be process "A"? Or would the tty in your example be process "B"? I guess I have a slight and subtle confusion about using "fork" and "forked" in the verb context. When you said "You actually forked a child ("B")", was forking the child a result of calling fork() in process "A", or calling fork() in process "B"? I hope you can see what I'm getting at here. :P
# 4  
Old 12-19-2016
Quote:
Originally Posted by SirSalt
Alright, thank you for clarifying that Smilie

---------- Post updated 12-18-16 at 09:20 PM ---------- Previous update was 12-17-16 at 10:28 PM ----------

As I meditated on what you said, I thought of something. In your #3 explanation, would the tty be process "A"? Or would the tty in your example be process "B"? I guess I have a slight and subtle confusion about using "fork" and "forked" in the verb context. When you said "You actually forked a child ("B")", was forking the child a result of calling fork() in process "A", or calling fork() in process "B"? I hope you can see what I'm getting at here. :P
In #3, A calls fork(). At that point you have processes A and B. Then B calls fork(). At that point you have processes A, B, and C all running the same instructions. Then B calls exit() leaving you with processes A and C running. Then C calls execl() (or another function from the exec family) to replace the instructions C was running with the instructions needed to run the daemon. At that point you then have A running the code it was running and you have C running your daemon.

Note that since C was a child of B and B exited, A cannot use wait() to determine whether or not C is still running and cannot retrieve the exit status of C using wait(). (Grandparents do not become the parents of their children's orphaned children when their children die before their grandchildren.)
This User Gave Thanks to Don Cragun For This Post:
# 5  
Old 12-19-2016
Thanks, Don. That makes sense now.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

[Quick question]Problem with execl and GREP

Guys, I have the following code #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/wait.h> #include <unistd.h> void read2(); main(int argc, char** argv) { int pid,status; pid=fork(); if ( pid == 0 ) { read2(argv,... (4 Replies)
Discussion started by: pfpietro
4 Replies

2. UNIX for Dummies Questions & Answers

problem using execl to start a tftp process

Hi, I'm very new to Linux but have been muddling my way through quite happily until recently. I'm trying to write a program in C++ which starts a new process using the execl command. I am trying to run the tftp process as follows: char ip_addr = "..."; if (execl("usr/bin/tftp", "tftp",... (2 Replies)
Discussion started by: JoC
2 Replies

3. UNIX for Dummies Questions & Answers

Replacing a particular string in all files in folder and file contents

I need to replace all filesnames in a folder as well as its content from AK6 to AK11. Eg Folder has files AK6-Create.xml, AK6-system.py etc.. the files names as well as contents should be changes to AK9-Create.xml, AK9-system.py etc All files are xml and python scripts. ---------- Post... (0 Replies)
Discussion started by: Candid247
0 Replies

4. Shell Programming and Scripting

Perl question - How do I print contents of an array on a single line?

I have the following code: print @testarray; which returns: 8 8 8 9 How do I return the array like this: The output is: 8, 8, 8, 9 (5 Replies)
Discussion started by: streetfighter2
5 Replies

5. Shell Programming and Scripting

sed command for copying the contents of other file replacing it another file on specifc pattern

We have 2 file XML files - FILE1.XML and FILE2.xml - we need copy the contents of FILE1.XML and replace in FILE2.xml pattern "<assignedAttributeList></assignedAttributeList>" FILE1.XML 1. <itemList> 2. <item type="Manufactured"> 3. <resourceCode>431048</resourceCode> 4. ... (0 Replies)
Discussion started by: balrajg
0 Replies

6. Shell Programming and Scripting

Replacing string in all instances (both filenames and file contents) in a directory

Hi, I have a set of files stored in a single directory that I use to set parameters for a physics code, and I would like to streamline the process of updating them all when I change a parameter. For instance, if the files are called A2000p300ini, A2000p300sub, A2000p300run, and the text in each... (3 Replies)
Discussion started by: BlueChris
3 Replies

7. Shell Programming and Scripting

replacing text with contents from another file

I'm trying to change the ramfs size in kernel .config automatically. I have a ramfs_size file generated with du -s cat ramfs_size 64512 I want to replace the linux .config's ramdisk size with the above value CONFIG_BLK_DEV_RAM_SIZE=73728 Right now I'm doing something dumb like: ... (3 Replies)
Discussion started by: amoeba
3 Replies

8. Shell Programming and Scripting

Replacing contents in a file from multiple programmes

Hi All, I have a query on Perl. I have a text file which has 3 lines, i want to only replace the first line with my replaced text and keep the rest of the text. FOr eg Before change --> echo:a:pending echo:b:pending echo:c:pending After change ---> echo:a:done echo:b:pending... (1 Reply)
Discussion started by: tosatesh
1 Replies

9. Shell Programming and Scripting

sed question - replacing param values

Hello, Do you have any idea why the below sed command is also replacing the value of "PARAMETER2" instead of just "PARAMETER" in file1 ? % parameter=PARAMETER % new_value=2 % cat file1 PARAMETER=1 PARAMETER2=1 % cat file1 | sed s/*$/${new_value}/1 PARAMETER=2 PARAMETER2=2 Thanks. (3 Replies)
Discussion started by: majormark
3 Replies

10. Shell Programming and Scripting

replacing contents of files from a bash script

I'm writing a shell script and I need to replace the contents of a configuration file based on what is passed to the script...can I replace expressions in a file from a bash shell script? (2 Replies)
Discussion started by: HumanBeanDip
2 Replies
Login or Register to Ask a Question