① linux中system和exec函數的區別
system是用shell來調用程序=fork+exec+waitpid,而exec是直接讓你的程序代替用來的程序運行。
system 是在單獨的進程中執行命令,完了還會回到你的程序中。而exec函數是直接在你的進程中執行新的程序,新的程序會把你的程序覆蓋,除非調用出錯,否則你再也回不到exec後面的代碼,就是說你的程序就變成了exec調用的那個程序了。
看一下,下面的例子.
例子1
---------------------------------
system("your_program");
printf("You can see me! ");
---------------------------------
例子2
---------------------------------
exec("your_program");
printf("You can't see me! ");
---------------------------------
在例子1中,在你的程序執行完畢以後,會執行printf語句。
在例子2中,由於exec將程序your_program代替了本身,因此程序不再會執行printf語句。
在Linux下,exec通常會和fork語句一起用。
看下面的這個例子
--------------------------------------------
pid_t pid = fork();
if (pid < 0) {
printf(「fork error!」);
exit(-1);
} else if (pid == 0) {
//這里是子進程
printf("I'm son! ");
//執行其它的程序
exec("your_program");
} else {
//這里是父進程
printf("i'm father!");
wait();//等待子進程結束後返回
exit(0);
}
② linux shell腳本 解釋exec
判斷/var/log/x.log文件是否為空
如果為空,則將exec的操作結果放入/var/log/x.log中
exec應該是一個命令,但是這邊這個語法沒有意義
③ 關於Linux的shell的exec命令
wall是向所有登錄系統的用戶發送信息,消息的內容是 "Thanks for all the fish" , 相當於簡訊群發。
exec 3<afile 打開文件afile,文件描述符是3,然後這個3就可以代表文件afile,比如
cat <&3 查看文件afile的內容
④ linux中fork,source和exec的區別
fork是系統調用,用來創建子進程。
source 讀取函數,讀取配置文件的時候用,不創建子進程,也是'.'
exec是創建進程,但是是創建的進程取代原來的進程,
所以fork是繼承皇位,exec是推翻皇朝;
比如安卓系統中:就是用exec進行rootfs切換的;因為他用的是busybox,所以真假rootfs之間的切換用exec的;
⑤ linux 系統中execl的作用是
intexecl(constchar*path,constchar*arg,...);
是系統提供的介面函數
execl是exec函數族中的一員
exec族函數的功能是載入一個新的程序替換掉當前的進程
它可以調用一個外部程序到當前的進程空間里
但不會產生一個新的進程(它只是將當前進程的映像替換成新載入的程序的映像)
可以寫一個程序清楚地看到
d.c
#include<stdio.h>
#include<unistd.h>
intmain(intargc,char**argv)
{
printf("pid=%dppid=%d ",getpid(),getppid());
return0;
}
f.c
#include<stdio.h>
#include<unistd.h>
intmain(intargc,char**argv)
{
printf("pid=%dppid=%d ",getpid(),getppid());
execl("./d","d",NULL);
return0;
}
在未執行execl調用之前和執行execl之後pid和ppid完全相同
由此可見execl並沒有創建新的進程
⑥ linux進程通信 中的exec問題
哪裡寫的這些...好亂阿..
先解釋下基本的:
int main(argc,char * argv[])
main的參數,就是命令行參數.
比如你的可執行文件是test,你希望在程序執行時傳入IP地址,那麼可以這樣:
./test 127.0.0.1
此時,argc =1,argv[1]是就是指向"127.0.0.1"指針(命令參數全部當作字元串來處理的)。
而 argv[0]就代表第一個參數,這里對應的就是"./test"。
argc和argv在mian裡面都是可以使用的,出了main的范圍就不能使用了。
再來說你提出的第一個地方,exec的問題。
exec實際上包含了一組函數,execl, execlp, execle, execv, execvp, execvpe
具體使用方法,你man execv就可以得到這些函數的使用方法。
exec函數的作用是,產生一個新進程,結束當前進程(具體執行的操作是復制當前進程的一部分數據和許可權,然後根據參數啟動一個新的進程)。
exec這組函數執行時候,需要提供的參數包括:一個可執行程序的路徑,傳遞給可執行程序的參數。(這里的參數,與剛才說到的main的參數含義相同。)
說到這里應該明白了吧...就一個。
我不知道你要hello world干什麼...照你意思給寫了個.
第一個,就是你貼出來的代碼改動一點點(我這邊運行有點問題):
#include <stdio.h>
main(int argc,char* argv[])
{
int i=0
while(i<=argc)
{
printf("arguement %d : %s ",i,argv[i]);
printf("\n");
i++;
}
}
運行程序:
$gcc test.c -o test
$./test hello world
輸出結果:
[ksl@myhost WGX]$ ./test hello world
Arguement 0:./test
Arguement 1:hello
Arguement 2:world
Arguement 3:(null)
然後第二個,使用exec的例子,我用execl吧..
文件名是test1.c
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
void main(int argc,char *argv[])
{
printf("This is not exec...");
execl("./test","hello","world",NULL);
//如果exec執行正常,下面的printf將不會被執行
//因為當前進程已經結束,./test將被執行
printf("exec error");
}
輸出結果:
[ksl@myhost WGX]$ ./test1
Arguement 0:hello
Arguement 1:world
Arguement 2:(null)
後者並沒輸出"./test"....就是exec啟動的程序,其命令行參數中只有參數.(我也不曉得原因...=.=||)
⑦ linux下exec函數不返回結果
yes you are right , exec 是不返回的,它將當前進程的內容替換成要執行的程序的內容,這樣就可以運行一個新的程序了。如果exec 返回了說明執行新程序出錯了,內存不夠啊,系統異常啊。。
⑧ linux exec命令主要用來干什麼的啊
從外部看是執行一個外部程序,從內部看是開啟一個進程來執行目標程序。