execvp出错

本人初学操作系统,因此对一些函数不了解(在Linux环境下)。今天搞了2、3个小时才把execvp这个函数执行成功(在老师帮助之下)。特来把错误贴上,以防有人跟我犯一样的错误。
execvp作用是使子进程执行其他的代码。原型:int execvp(const char文件名,charconst argv[])。在执行成功是不返回值,发生错误返回-1.
描述:execvp函数与execv类似,不同之处在于它搜索path环境变量中列出的目录,以便在文件名不包含斜杠的情况下从文件名中查找文件的完整文件名。
此函数对于执行系统实用程序非常有用,因为它会在用户选择的位置查找这些程序。shell使用它来运行用户键入的命令。
但是没有实例,很多伙伴仍然会一头雾水。这里就以我已经编译通过的代码作为实例。

 			char*p[2];
        	char str1[]="abc";
        	char str2[]="";
        	p[0]=str1;
        	p[1]=str2;
        	//char* const p[]= {"abc", NULL};
        	if(execvp("/home/jerry/Desktop/experiment1/abc", p) == -1)
        	{
				printf("fail to exec\n");
				exit(1);
        	}

注明:可以直接写char*p[]={“abc”, NULL}.但第二个位置一定为空。这里的abc是我一个helloword工程中的可执行文件。如图在这里插入图片描述
结果在这里插入图片描述
老师的指点:
在这里插入图片描述
在这里插入图片描述

希望可以帮到大家。同时提前祝祖国生日快乐。

好的,下面是一个简单Shell程序的基本功能的代码示例,可以实现上述要求: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/wait.h> #define MAX_INPUT_SIZE 1024 #define MAX_TOKEN_SIZE 64 #define MAX_NUM_TOKENS 64 void print_prompt() { printf("shell> "); fflush(stdout); } void read_command(char* cmd_line, char* tokens[], int* num_tokens) { // 读取用户输入的命令行 fgets(cmd_line, MAX_INPUT_SIZE, stdin); // 将命令行字符串转换为一个 token 数组 *num_tokens = 0; char* token = strtok(cmd_line, " \t\n"); while (token != NULL && *num_tokens < MAX_NUM_TOKENS) { tokens[*num_tokens] = token; (*num_tokens)++; token = strtok(NULL, " \t\n"); } tokens[*num_tokens] = NULL; } void execute_command(char* tokens[], int num_tokens) { // 判断命令是否有效 if (num_tokens == 0) { return; } // 处理内部命令 if (strcmp(tokens[0], "help") == 0) { printf("This is a simple shell program.\n"); printf("Supported commands:\n"); printf("help - display this help message\n"); printf("exit - exit the shell program\n"); return; } else if (strcmp(tokens[0], "exit") == 0) { exit(0); } // 创建子进程并执行命令 pid_t pid = fork(); if (pid == 0) { // 子进程执行命令 execvp(tokens[0], tokens); // 如果 execvp() 函数返回,说明命令执行失败 fprintf(stderr, "Failed to execute command: %s\n", tokens[0]); exit(1); } else if (pid > 0) { // 父进程等待子进程结束 int status; waitpid(pid, &status, 0); } else { fprintf(stderr, "Failed to fork process.\n"); } } int main() { char cmd_line[MAX_INPUT_SIZE]; char* tokens[MAX_NUM_TOKENS]; int num_tokens; while (1) { print_prompt(); read_command(cmd_line, tokens, &num_tokens); execute_command(tokens, num_tokens); } return 0; } ``` 上述代码实现了一个简单的 Shell 程序,可以接收用户输入的命令行,并将其解析成一个 token 数组。然后程序判断命令是否有效,如果是内部命令则执行相应的操作,否则创建子进程并执行命令。程序还支持管道和重定向命令。执行结果或出错信息会在命令行界面显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值