exec系統調用會從當前進程中把當前程序的機器指令清除,然後在空的進程中載入調用時指定的程序代碼,最後運行這個新的程序。
- #include<stdio.h>
- #include<signal.h>
- #include<string.h>
- #include<unistd.h>
-
- #define MAXARGS (20)
- #define ARGLEN (100)
-
- int main()
- {
- char *arglist[MAXARGS + 1];
- int numargs;
- char argbuf[ARGLEN];
- char *makestring();
-
- numargs = 0;
-
- while(numargs < MAXARGS)
- {
- printf("Arg[%d]?", numargs);
- if(fgets(argbuf, ARGLEN, stdin) && *argbuf != '\n')
- arglist[numargs ++] = makestring(argbuf);
- else
- {
- if(numargs > 0)
- {
- arglist[numargs] = NULL;
- execute(arglist);
- numargs = 0;
- }
- }
- }
-
- return 0;
- }
-
- int execute(char* arglist[])
- {
- /*
- *#include<unistd.h>
- *int execlp(const char* file, const char* argv ...)
- * eg. execlp("ps","ps","-au","-x",(char*)0);
- * 1.最後一個參數必須是(char*)0, 如果不強制轉換成char*,就會自動轉換成int* 有未知的錯誤。
- * 2.第一個參數是要運行的文件,會在環境變量PATH中查找file.
- * 3.失敗會返回-1, 成功無返回值,但是,會在當前進程運行,執行成功後,直接結束當前進程。可以在子進程中運行。
- * 4.第二個參數,是一個參數列表,如同在shell中調用程序一樣,參數列表為0,1,2,3……因此,ps作為第0個參數,需要重復一遍
- * int execvp(const char* file, const char* argv[]); argv列表最後一個必須是 NULL
- */
- execvp(arglist[0], arglist);
- perror("execvp failed");
- exit(1);
- }
-
- char* makestring(char *buf)
- {
- char *cp, *malloc();
-
- buf[strlen(buf) - 1] = '\0';
- cp = malloc(strlen(buf) + 1);
-
- if(cp == NULL)
- {
- fprintf(stderr, "no memory\n");
- exit(1);
- }
- strcpy(cp, buf);
- return cp;
- }