A. linux下execl()進程管理函數的參數理解
/bin/ls 是執行文件, ls,-al。。。。接下去的依次是shell裡面的參數0,1。。。。
環境變數的意思就是環境變數。。。
B. 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啟動的程序,其命令行參數中只有參數.(我也不曉得原因...=.=||)
C. Linux-C語言execl函數的使用問題
在終端里敲:man execl 然後自己看手冊...
D. linux中execl()這個函數的具體用法怎麼樣的啊 希望高人指教,最好能有一個簡單的例子
man execl ,,,裡面非常的詳細,還有例子,比在這里回答方便的多。
以後要多學會用man命令去查詢linux中不知道的東西。
E. 誰能解釋一下linux下execle函數的用法嗎最好能給一個程序例子!
如果你理解execv, 那麼execle和他的區別就是, 前者的調用參數是以數組形式給的,而後者則是以列表方式給,也就是execle(path, arg1, arg2, ..., envp), 並且提供了環境變數參數;
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
char *envp[]={"PATH=/tmp","USER=shan",NULL};
if(fork()==0)
{
if(execle("/bin/dir","dir",NULL,envp)<0)
perror("execle error!");
}
return 0;
}
F. linux C語言 exec函數的相關問題
直接把宏定義成字元串啊,就可以了
#define FILEPATHA $(HOME)/
#define FILEPATHB 「Elevator/floor_three」
char* FILEPATH=NULL;
FILEPATH=(char*)malloc(30);
memcpy(FILEPATH,A,strlen(A));//拼接字元串
strcat(FILEPATH,B);
G. linux中進程的vfork()和execl()函數
寫兩個測試程序測試一下,在程序裡面加log。
自己調試才會理解深刻。
很簡單的一個進程編寫問題。
H. linux中為什麼在fork裡面execl呢
因為exec系列的函數(包括execl函數)都是將當前進程替換成新進程,也就是說新進程啟動後原來的進程就不存在了,exec系列函數後面的那些代碼就不會再執行了。如果你不放在fork子進程裡面,那主進程在執行execl函數後就完全不存在了,所以exec系列函數的使用都是先fork然後在子進程裡面調用。
I. Linux編程問題,execl("/bin/ls", "ls", "-al", "/etc/passwd", (char *) 0);
execl,l代表list,參數表的意思,
(char *) 0,代表空指針,說明參數表結束。
這個函數的原型是可變參數,空指針給庫解析參數的時候防止程序錯誤。execl是個庫函數,真正的系統調用是execve。
J. 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並沒有創建新的進程