- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写一个 shell,目前正在执行管道进程。我能够运行 "ls -l | wc"
,但是当运行 "ls -l|wc"
时,进程失败。
我曾尝试使用 gdb 进行调试,但无法对其进行任何调试,因为它们看起来都等于相同的值(在解析后)。
运行 ls -l | 时wc
并在 parseCmdWithPipe
函数上设置断点并打印出我得到的局部变量:
argOne = {0x7fffffffdad0 "ls", 0x7fffffffdad3 "-l", 0x0}
argTwo = {0x7fffffffdad8 "wc", 0x0}
当运行 ls -l|wc
并在 parseCmdWithPipe
函数上设置断点并打印出局部变量时,我得到:
argOne = {0x7fffffffd9b0 "ls", 0x7fffffffd9b3 "-l", 0x0}
argTwo = {0x7fffffffd9b8 "wc", 0x0}
我用来解析和使用execvp
的代码(第二个函数)
/* parse user input from fget */
int parseLine(char *line, char **argv) {
line[strlen(line) - 1] = '\0';
//This section tries to figure out if we have the case
//"ls -l|wc", if it does it makes a new string of "ls -l | wc"
int cmdType = 1;
int size = sizeof(line);
char tempLine[size + 3];
bool pipeSeen = false;
for (int i = 0; i < size; i++) {
if (line[i] == '|' && line[i - 1] != ' ') {
tempLine[i] = ' ';
tempLine[i + 1] = '|';
tempLine[i + 2] = ' ';
pipeSeen = true;
} else {
if (pipeSeen == true)
tempLine[i + 2] = line[i];
else
tempLine[i] = line[i];
}
}
if (pipeSeen == true) {
tempLine[size + 2] = '\0';
line = tempLine; // change "ls -l|ls to ls -l | wc"
}
/* parse line and store it in argv */
while (*line) {
while (*line == ' ')
*line++ = '\0';
//Figure out what type of command we may have
if (*line == '<')
cmdType = (cmdType == 3) ? 5 : 2;
else if (*line == '>' )
cmdType = (cmdType == 2) ? 5 : 3;
else if (*line == '|')
cmdType = 4;
*argv++ = line;
while (*line != '\0' && *line != ' ' && *line != '\t' && *line != '\n')
line++;
}
*argv = '\0';
return cmdType;
}
void parseCmdWithPipe(char **argv) {
int size = getCmdSize(argv);
char val[1];
int pipePosition = 0;
for (int i = 0; i < size; i++) {
strcpy(val, argv[i]);
if (val[0] == '|') {
pipePosition = i;
break;
}
}
char *argOne[pipePosition + 1];
for (int i = 0; i < pipePosition; i++) {
argOne[i] = argv[i];
}
argOne[pipePosition] = '\0';
char *argTwo[size - pipePosition];
for (int i = 0; i < (size - pipePosition); i++) {
argTwo[i] = argv[i + pipePosition + 1];
}
argTwo[size - pipePosition - 1] = '\0';
int pfd[2], pid;
if (pipe(pfd) == 1)
syserror("Could Not create a pipe");
switch (pid = fork()) {
case -1:
syserror( "Fork Failed" );
case 0:
if (dup2(pfd[0], 0) == -1|| close (pfd[0]) == -1 || close (pfd[1]) == -1)
syserror("Failed to run dup2 or close pfd in second child");
execvp(argTwo[0], argTwo);
syserror("execvp unsuccessful in 2nd child");
}
....
我希望 "ls -l|wc"
给我相同的结果 "ls -l | wc"
给我
11 92 597
但实际输出是
execvp unsuccessful in 2nd child
(No such file or directory)
最佳答案
主要问题是int size = sizeof(line);
它不计算 line
指向的字符串的大小和长度。 , 但仅评估为 char *
的大小.
你应该写int size = strlen(line);
并且可能不会调用此变量 size
,但是 len
相反。
代码太复杂,你不应该尝试在|
两边插入空格符号,顺便说一句,你没有对 <
做同样的事情和 >
.
关于c - Execvp 与 "ls -l | wc"一起工作,但因“ls -l|wc”而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54757028/
我有以下疑问。 wc -m 和 wc -c 总是给出相同的输出。我也尝试使用 float ,但两个命令的输出相同。 cat test | wc -m 541 cat test | wc -c
我正在尝试找出两者之间的区别 ps | wc 和 ps r | wc 最佳答案 在 Linux 中,| 管道字符将一个命令的输出发出到另一个命令的输入。在这种情况下,ps 输出将发送到 wc。因此,这
我正在编写一个 shell,目前正在执行管道进程。我能够运行 "ls -l | wc",但是当运行 "ls -l|wc" 时,进程失败。 我曾尝试使用 gdb 进行调试,但无法对其进行任何调试,因为它
这两个命令是$(git ls-files -s | wc -l)吗?和 $(git ls-files -s >out && wc -l out && wc -l out && wc -l <out
这个问题在这里已经有了答案: How can I use a file in a command and redirect output to the same file without trunc
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
谁能告诉我这是怎么回事?我仍然是 fork 新手。计算机执行第一个和第二个,但第三个即 wc 不起作用。非常需要帮助。终端返回多个子进程完成但没有wc。 pid_t son; int i; for (
我想在不使用wc的临时文件的情况下检查某个文件的行数。我尝试使用类似这样的东西:var=${wc -l a.txt} 或 wc -l a.txt |读取行 但两者都不起作用。 最佳答案 存储命令输出的
那一行是什么意思? ^-...------ | wc ... 它是 Bash 脚本的一部分。 最佳答案 试着写: ls -l | grep ^.......... | wc -l ls -l 的输出将
例如: myCleanVar=$( wc -l < myFile ) myDirtVar=$( wc -l myFile ) echo $myCleanVar 9 echo $myDirtVar 9
我想使用来自“wc”的行作为变量。例如: echo 'foo bar' > file.txt echo 'blah blah blah' >> file.txt wc file.txt 2 5 23
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
这个问题在这里已经有了答案: How can I use a file in a command and redirect output to the same file without trunc
我有一个包含未压缩文件和 gzip 文件的目录,我想在此目录上运行 wc -l。 wc 将为压缩文件提供一个不准确的行计数值(因为它似乎计算文件的 gzip 版本中的换行符)。有没有一种方法可以创建类
这个问题在这里已经有了答案: Whats is the behaviour of the "wc" command? (2 个答案) 关闭 6 年前。 我是 Linux/Unix 世界的新手,但发现
指定显示 .c 中代码行数的命令/命令集和 .h当前目录中的文件,按字母顺序显示每个文件,后跟:以及文件中的行数,最后是代码行数。 . 可能显示的示例是: main.c: 202 util.c: 12
我正在尝试运行这个脚本: #!/bin/sh cd $1 for i in */*.$2 do if [ 'wc –c $i' -gt $3 ] then chmod o-r
当我提交大量更改(数百兆字节)时,即使 checkin 确实通过,客户端也会超时。 当我右键单击 WC 并显示日志时,TSVN 显示即使 checkin 实际发生,WC 修订版也不会更新。 我已经尝试
我有几个从旧存储库中 check out 的工作副本。 旧存储库现在合并为一个新存储库,因此存储库名称和新存储库内的位置已更改。 现在我想将这些工作副本重新定位到新的存储库中的新位置。 使用 Tort
在 iOS 和 iWatch 设备之间建立连接,xCode 写入 [WC] WCSession 对应应用程序未安装。 经过大量研究,我找到了一个解决方案,也许它会对某人有所帮助。 - Check yo
我是一名优秀的程序员,十分优秀!