歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> Linux下C程序插入執行shell腳本

Linux下C程序插入執行shell腳本

日期:2017/3/1 9:47:54   编辑:SHELL編程

最近在看深入理解計算機系統,看到一個函數叫做execve(),這個函數很有意思,可以在一個進程插入另外一個進程執行,但是又不像fork()一樣產生一個子進程,execve()插入的進程和原進程共享進程號,就好像執行這進程就像執行過程調用一般隨意。

函數原型如下:

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
插入一個shell腳本執行:


#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 執行:

./execve ./script.sh

會在當前終端下輸出所有的文件


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
很好很強大~~

Copyright © Linux教程網 All Rights Reserved