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;
}

留言

這個網誌中的熱門文章

如何將Linux打造成OpenFlow Switch:Openvswitch

如何利用 Wireshark 來監聽 IEEE 802.11 的管理封包

我弟家的新居感恩禮拜分享:善頌善禱