如何在C语言中使用execv执行echo、grep、wc三个命令?
问题解答
能否直接用execv实现你的需求?
不能直接实现,核心原因如下:
- execv的作用是用单个可执行程序的镜像替换当前进程的运行内容,一次只能执行一个程序,无法同时运行echo、grep、wc三个程序
- 你代码中的
|管道符、反引号都是shell专属的语法,execv不会解析这类语法,只会将其作为普通参数传递给第一个执行的程序 - 你现有代码还存在多个语法/逻辑错误:
- execv第一个参数只能传入单个可执行文件的绝对路径,不支持填写多个路径
- 命令数组直接放入int类型的变量
g,和要求的char*参数类型不匹配,会触发内存访问错误 - execv执行成功后会完全替换当前进程的代码,循环内的
g++逻辑永远不会被执行
可行的实现方案
有三种成熟的实现方式,你可以根据需求选择:
方案1:通过shell执行整条命令(代码量最少)
直接调用sh解析整条命令,shell会自动处理管道、参数替换等逻辑,示例代码如下:
#include <stdio.h> #include <unistd.h> #include <sys/wait.h> void count_lines(unsigned short G) { for (unsigned short g = 0; g <= G; g++) { char cmd_buf[256]; // 拼接完整的shell命令 snprintf(cmd_buf, sizeof(cmd_buf), "echo \"Number of lines by processes of generation %d is $(grep -o \"G is %d\" out.txt | wc -l)\"", g, g); // fork子进程执行命令,避免替换主进程 if (fork() == 0) { execlp("/bin/sh", "sh", "-c", cmd_buf, NULL); _exit(1); // exec执行失败才会走到这里 } wait(NULL); // 等待子进程执行完成再进入下一轮循环 } }
方案2:纯C实现管道逻辑(无shell依赖)
你可以自己调用pipe()创建管道,fork三个子进程分别执行echo、grep、wc,手动对接三个进程的输入输出,这种方式没有shell中间层,但是代码量会大很多。
方案3:直接用C读取文件统计(性能最优)
不需要调用任何外部命令,直接用C读取out.txt统计匹配行数,性能最高,逻辑也最简单,示例代码如下:
#include <stdio.h> #include <string.h> void count_lines(unsigned short G) { for (unsigned short g = 0; g <= G; g++) { char match_str[32]; snprintf(match_str, sizeof(match_str), "G is %d", g); int count = 0; char line_buf[1024]; FILE *fp = fopen("out.txt", "r"); if (!fp) { perror("打开out.txt失败"); return; } while (fgets(line_buf, sizeof(line_buf), fp)) { if (strstr(line_buf, match_str)) { count++; } } fclose(fp); printf("Number of lines by processes of generation %d is %d\n", g, count); } }
内容的提问来源于stack exchange,提问作者ocram ali
相关产品推荐
相关产品推荐

