exec() family
這只是一件小事,特此記錄用以提醒
在 Google 上面搜尋 exec 系列的 example code,常常會看到下面的寫法:
#include <unistd.h>
int main()
{
....char * argv[ ] ={ "ls","-al","/etc/passwd",0};
....execvp("ls",argv);
....return 0;
}
這是一個很簡單的範例,很可以編譯執行,但卻暗藏危險
Why?
首先,來問問看「男人」
The exec() family of functions replaces the current process image with a new process image.
這句話的意思是「將外部程式(ELF image)取代掉原來的 process」
所以,一般來說,在程式裡面要使用 exec 系列的 functions 時,不能在 parent process 裡叫用 exec system call 來跑外部程式;否則 parent process 會消失。正確的作法應該是先 fork 一個 process,並於那個 process 裡面進行 exec 的呼叫。而上面的範例之所以沒問題只能說是「剛好」沒問題而已,為什麼剛好沒問題... 自己看囉~
一個可以看出錯誤的例子
#include <unistd.h>
#include <stdio.h>
int main()
{
....int a = 0;
....char * argv[ ] ={ "ls","-al","/etc/passwd",0};
....execvp("ls",argv);
....a++; // 你會發現這裡不會執行唷~
....printf("a = %d\n", a); //
....return 0;
}
正確的範例
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
int main()
{
....int a;
....char * argv[ ] ={ "ls","-al","/etc/passwd",0};
....pid_t pid;
....pid = fork();
....if( pid < 0 )
....{
........printf("Error\n");
....}
....else if( pid == 0 )
....{
........execvp("ls",argv);
....}
....else if ( pid > 0 )
....{
........a = 0 ;
........a++;
........printf("a = %d\n", a);
....}
....return 0;
}
在 Google 上面搜尋 exec 系列的 example code,常常會看到下面的寫法:
#include <unistd.h>
int main()
{
....char * argv[ ] ={ "ls","-al","/etc/passwd",0};
....execvp("ls",argv);
....return 0;
}
這是一個很簡單的範例,很可以編譯執行,但卻暗藏危險
Why?
首先,來問問看「男人」
The exec() family of functions replaces the current process image with a new process image.
這句話的意思是「將外部程式(ELF image)取代掉原來的 process」
所以,一般來說,在程式裡面要使用 exec 系列的 functions 時,不能在 parent process 裡叫用 exec system call 來跑外部程式;否則 parent process 會消失。正確的作法應該是先 fork 一個 process,並於那個 process 裡面進行 exec 的呼叫。而上面的範例之所以沒問題只能說是「剛好」沒問題而已,為什麼剛好沒問題... 自己看囉~
一個可以看出錯誤的例子
#include <unistd.h>
#include <stdio.h>
int main()
{
....int a = 0;
....char * argv[ ] ={ "ls","-al","/etc/passwd",0};
....execvp("ls",argv);
....a++; // 你會發現這裡不會執行唷~
....printf("a = %d\n", a); //
....return 0;
}
正確的範例
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
int main()
{
....int a;
....char * argv[ ] ={ "ls","-al","/etc/passwd",0};
....pid_t pid;
....pid = fork();
....if( pid < 0 )
....{
........printf("Error\n");
....}
....else if( pid == 0 )
....{
........execvp("ls",argv);
....}
....else if ( pid > 0 )
....{
........a = 0 ;
........a++;
........printf("a = %d\n", a);
....}
....return 0;
}
留言
張貼留言