Hi List, I am learning Linux and trying to understand exec and fork function. execl says that it overlays the running address space. What does it mean? I created the following program and used top command with intentionally wrong arguments: #include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<stdlib.h> int main(){ int a = -1; if(fork()==0){ printf("Inside child\n"); printf("child pid=%d, parentid=%d\n", getpid(), getppid()); execl("/usr/bin/top", "/usr/bin/top", ">/dev/null" ,(char*)0 ); scanf("inside child provide a %d", &a); printf("Inside child a=%d\n", a); exit(1); } else { printf("Inside parent, going to wait\n"); printf("my pid=%d, parentid=%d\n", getpid(), getppid()); scanf("input parent %d\n", &a); wait(NULL); printf("Wait over\n"); printf("Inside parent a=%d\n", a); } return 0; } When i run this program, it gives following output: [vijay@localhost]$ ./a.out Inside parent, going to wait Inside child child pid=2775, parentid=2774 my pid=2774, parentid=2681 top: unknown argument '>' usage: top -hv | -bcisSHM -d delay -n iterations [-u user | -U user] -p pid [,pid ...] 10 Wait over Inside parent a=-1 [vijay@localhost]$ Why the child scanf and printf not executed? In the parent program, i expected input parent should be printed. But it doesnt and just wait for some input. When i entered 10 it resumes but printing -1 as a value. Could anyone please help me to understand this behavior? or any good tutorial or book Thanks. Vijay
-----Original Message----- From: kernelnewbies-bounces@kernelnewbies.org [mailto:kernelnewbies- bounces@kernelnewbies.org] On Behalf Of Vijay Chauhan Sent: Monday, February 06, 2012 11:08 AM To: kernelnewbies@kernelnewbies.org Subject: fork() and exec()
Hi List,
I am learning Linux and trying to understand exec and fork function. execl says that it overlays the running address space. What does it mean?
I created the following program and used top command with intentionally wrong arguments:
#include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<stdlib.h>
int main(){ int a = -1; if(fork()==0){ printf("Inside child\n"); printf("child pid=%d, parentid=%d\n", getpid(), getppid()); execl("/usr/bin/top", "/usr/bin/top", ">/dev/null" ,(char*)0 ); scanf("inside child provide a %d", &a); printf("Inside child a=%d\n", a); exit(1); } else { printf("Inside parent, going to wait\n"); printf("my pid=%d, parentid=%d\n", getpid(), getppid()); scanf("input parent %d\n", &a); wait(NULL); printf("Wait over\n"); printf("Inside parent a=%d\n", a); } return 0; }
When i run this program, it gives following output: [vijay@localhost]$ ./a.out Inside parent, going to wait Inside child child pid=2775, parentid=2774 my pid=2774, parentid=2681 top: unknown argument '>' usage: top -hv | -bcisSHM -d delay -n iterations [-u user | -U user] -p pid [,pid ...]
10 Wait over Inside parent a=-1 [vijay@localhost]$
Why the child scanf and printf not executed?
Because when you called execl(), the code in the child was replaced by the top executable. execl() replaces the code calling it. The only way code following a call to execl() or its siblings will ever execute is if the call to execl() is unsuccessful, for instance, fails to find the top program in the current path.
In the parent program, i expected input parent should be printed. But it doesnt and just wait for some input. When i entered 10 it resumes but printing -1 as a value.
Your scanf() is expecting input that looks something like this: input parent 10 You just entered 10, so the format string didn't match input and the variable "a" was never assigned. Jeff Haran
Could anyone please help me to understand this behavior? or any good tutorial or book
Thanks. Vijay
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
These are the first two results when I search "fork vs exec" in google. http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html http://en.wikipedia.org/wiki/Fork-exec I found very good explanations in both the links(yolinux is a bit better) -Sri On Tue, Feb 7, 2012 at 12:38 AM, Vijay Chauhan <kernel.vijay@gmail.com>wrote:
Hi List,
I am learning Linux and trying to understand exec and fork function. execl says that it overlays the running address space. What does it mean?
I created the following program and used top command with intentionally wrong arguments:
#include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<stdlib.h>
int main(){ int a = -1; if(fork()==0){ printf("Inside child\n"); printf("child pid=%d, parentid=%d\n", getpid(), getppid()); execl("/usr/bin/top", "/usr/bin/top", ">/dev/null" ,(char*)0 ); scanf("inside child provide a %d", &a); printf("Inside child a=%d\n", a); exit(1); } else { printf("Inside parent, going to wait\n"); printf("my pid=%d, parentid=%d\n", getpid(), getppid()); scanf("input parent %d\n", &a); wait(NULL); printf("Wait over\n"); printf("Inside parent a=%d\n", a); } return 0; }
When i run this program, it gives following output: [vijay@localhost]$ ./a.out Inside parent, going to wait Inside child child pid=2775, parentid=2774 my pid=2774, parentid=2681 top: unknown argument '>' usage: top -hv | -bcisSHM -d delay -n iterations [-u user | -U user] -p pid [,pid ...]
10 Wait over Inside parent a=-1 [vijay@localhost]$
Why the child scanf and printf not executed? In the parent program, i expected input parent should be printed. But it doesnt and just wait for some input. When i entered 10 it resumes but printing -1 as a value.
Could anyone please help me to understand this behavior? or any good tutorial or book
Thanks. Vijay
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
-- SK Malik
On Die, 2012-02-07 at 00:38 +0530, Vijay Chauhan wrote:
Hi List,
I am learning Linux and trying to understand exec and fork function. execl says that it overlays the running address space. What does it mean?
I created the following program and used top command with intentionally wrong arguments:
#include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<stdlib.h>
int main(){ int a = -1; if(fork()==0){ printf("Inside child\n"); printf("child pid=%d, parentid=%d\n", getpid(), getppid()); execl("/usr/bin/top", "/usr/bin/top", ">/dev/null" ,(char*)0 );
You get here only if the execl() as such fails.
scanf("inside child provide a %d", &a);
You should check the return value here if you actually got a matching parameter. scanf() is actually a function to be avoided.
printf("Inside child a=%d\n", a); exit(1); } else { printf("Inside parent, going to wait\n"); printf("my pid=%d, parentid=%d\n", getpid(), getppid()); scanf("input parent %d\n", &a);
You should check the return value here if you actually got a matching parameter. scanf() is actually a function to be avoided.
wait(NULL);
You should check the return value here to know why "wait()" returns.
printf("Wait over\n"); printf("Inside parent a=%d\n", a); } return 0; }
Bernd -- Bernd Petrovitsch Email : bernd@petrovitsch.priv.at LUGA : http://www.luga.at
Thank you all for your help. Vijay. On Tue, Feb 7, 2012 at 9:10 PM, Bernd Petrovitsch <bernd@petrovitsch.priv.at> wrote:
On Die, 2012-02-07 at 00:38 +0530, Vijay Chauhan wrote:
Hi List,
I am learning Linux and trying to understand exec and fork function. execl says that it overlays the running address space. What does it mean?
I created the following program and used top command with intentionally wrong arguments:
#include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<stdlib.h>
int main(){ int a = -1; if(fork()==0){ printf("Inside child\n"); printf("child pid=%d, parentid=%d\n", getpid(), getppid()); execl("/usr/bin/top", "/usr/bin/top", ">/dev/null" ,(char*)0 );
You get here only if the execl() as such fails.
scanf("inside child provide a %d", &a);
You should check the return value here if you actually got a matching parameter. scanf() is actually a function to be avoided.
printf("Inside child a=%d\n", a); exit(1); } else { printf("Inside parent, going to wait\n"); printf("my pid=%d, parentid=%d\n", getpid(), getppid()); scanf("input parent %d\n", &a);
You should check the return value here if you actually got a matching parameter. scanf() is actually a function to be avoided.
wait(NULL);
You should check the return value here to know why "wait()" returns.
printf("Wait over\n"); printf("Inside parent a=%d\n", a); } return 0; }
Bernd -- Bernd Petrovitsch Email : bernd@petrovitsch.priv.at LUGA : http://www.luga.at
participants (4)
-
Bernd Petrovitsch -
Jeff Haran -
Srikrishan Malik(gmail) -
Vijay Chauhan