linux下C程序插入執(zhí)行shell腳本最近在看深入理解計(jì)算機(jī)系統(tǒng),看到一個(gè)函數(shù)叫做execve(),這個(gè)函數(shù)很有意思,可以在一個(gè)進(jìn)程插入另外一個(gè)進(jìn)程執(zhí)行,但是又不像fork()一樣產(chǎn)生一個(gè)子進(jìn)程,execve()插入的進(jìn)程和原進(jìn)程共享進(jìn)程號(hào),就好像執(zhí)行這進(jìn)程就像執(zhí)行過(guò)程調(diào)用一般隨意。 函數(shù)原型如下: int execve(const char *filename, char *const argv[], char *const envp[]); EXAMPLE The following program is designed to be execed by the second program below. It just echoes its command-line one per line. /* myecho.c */ #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int j; for (j = 0; j < argc; j++) printf("argv[%d]: %s\n", j, argv[j]); exit(EXIT_SUCCESS); } This program can be used to exec the program named in its command-line argument: /* execve.c */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char *argv[]) { char *newargv[] = { NULL, "hello", "world", NULL }; char *newenviron[] = { NULL }; if (argc != 2) { fprintf(stderr, "Usage: %s <file-to-exec>\n", argv[0]); exit(EXIT_FAILURE); } newargv[0] = argv[1]; execve(argv[1], newargv, newenviron); perror("execve"); /* execve() only returns on error */ exit(EXIT_FAILURE); } We can use the second program to exec the first as follows: $ cc myecho.c -o myecho $ cc execve.c -o execve $ ./execve ./myecho argv[0]: ./myecho argv[1]: hello argv[2]: world 插入一個(gè)shell腳本執(zhí)行: #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char *argv[]) { char *newargv[] = { "/etc" }; char *newenviron[] = { NULL }; if (argc != 2) { fprintf(stderr, "Usage: %s <file-to-exec>\n", argv[0]); exit(EXIT_FAILURE); } newargv[0] = argv[1]; execve(argv[1], newargv, newenviron); perror("execve"); /* execve() only returns on error */ exit(EXIT_FAILURE); } script.sh如下: #!/bin/bash ls 執(zhí)行: ./execve ./script.sh 會(huì)在當(dāng)前終端下輸出所有的文件 yca@ubuntu:~/桌面/hello$ ./execve ./script.sh 1 execve hello1 hello3 hello5 hello_lex 1.txt execve.c hello1.c hello3.cpp hello5.c k_max Bubble hello hello1.o hello3.o hello5.o k_max.c Bubble.c hello.c hello2.c hello3.s hello5.s lex.yy.c QuickSort.c hello.lex hello2.o hello4 hello5.s1 script.sh Quicksort1.c hello.sh hello2.s hello4.c hello51.s 很好很強(qiáng)大~~
3
0
(請(qǐng)您對(duì)文章做出評(píng)價(jià))
博主上一篇:疑問(wèn):進(jìn)程間通信
博主下一篇:文件描述符與進(jìn)程間通信之關(guān)聯(lián) 首頁(yè)上一篇:基于Heritrix+Lucene的搜索引擎構(gòu)建(1)——網(wǎng)絡(luò)蜘蛛Heritrix 首頁(yè)下一篇:選擇HttpHandler還是HttpModule? |
|
來(lái)自: quasiceo > 《計(jì)算機(jī)》