gpt4 book ai didi

C: 尝试实现无名管道

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:28:51 24 4
gpt4 key购买 nike

我正在尝试制作一个模拟终端无名管道的程序。例如,如果我想运行命令:

ls –l | grep '10'

会是:

./pipes ls -l - grep '10'

(我使用 - 而不是 |)。

但是,我的程序无法运行,因为 execvp 失败(地址错误)。这对我来说似乎是不可能的。我究竟做错了什么?欢迎任何帮助!

#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <assert.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>

void np_exec(char* cmd, char** argv)
{
int fd[2];

while(*(++argv) != NULL)
{
pipe(fd);

int pid = fork(); //parent executes
if(pid < 0)
{
printf("Error forking");
exit(1);
}

if(pid != 0) // parent
{
dup2(fd[1],1);
close(fd[0]);

if (execvp(cmd, *argv) == -1)
{
perror("execvp failed");
}
}
else
{
dup2(fd[0],0);
close(fd[1]);
}
}
}

int main(int argc, char** argv)
{
assert(strcmp(argv[argc-1], "-"));

int i;
for (i = 1; i < argc; ++i) {
if (!strcmp(argv[i], "-"))
{
argv[i] = NULL;
np_exec(argv[1], &argv[1]);
argv = &argv[i];
argc -= i;
i = 0;
}
}

char* args[argc];
args[argc-1] = NULL;

for (i = 1; i < argc; ++i) {
args[i-1] = argv[i];
}

if (execvp(args[0], args) == -1)
perror("execvp failed");

return;
}

最佳答案

替换:

                   if (execvp(cmd, *argv) == -1)

通过:

               if (execvp(cmd, argv) == -1)

注意事项:

a) 您使用的警告级别是否足够高?

b) 您必须为“execvp”添加一个“#include”。这样,编译器就会自己发现这个错误。

c) 最后一个返回语句必须是“return 0”。同样,编译器必须警告您这个主题。

关于C: 尝试实现无名管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30445227/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com