Linux   发布时间:2022-05-08  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了linux execvp; ls无法访问|,没有这样的文件或目录大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试编写 sHell.但是我的 sHell没有执行命令 – ls -l |减.我正在使用execvp.代码如下.
#include <stdio.h>
#include <unistd.h>
#include <String.h>

int main(){
    int pid,status,num,len;
    char str[1000],cwd[100];
    char* word[100];

    getcwd(cwd,sizeof(cwd));

    while(1){
        chdir(cwd);

        printf("%s > ",cwd);

        gets(str);

        pid=vfork();

        if(pid == 0){
            num = 0;
            word[num] = strtok (str," ");

            while (word[num] != NULL) {
                word[num] = strdup (word[num]);
                len = strlen (word[num]);
                if (strlen (word[num]) > 0)
                    if (word[num][len-1] == '\n')
                        word[num][len-1] = '\0';
                word[++num] = strtok (NULL," ");
            }

            if(strcmp(word[0],"cd") == 0){
                chdir(word[1]);
                getcwd(cwd,sizeof(cwd));
            }
            else{
                execvp(word[0],word);
            }

            exit(0);
        }
        else{
            wait(&status);
        }
    }

    return 0;
}

解决方法

ls -l | less实际上是一个sHell命令行,它由两个由管道连接的进程组成. execvp()调用只能生成一个进程.

如果要从程序中执行此操作,则必须显式调用sHell – 通过使用system()调用或将命令行更改为sh -c’ls -l |减’.你的单词数组应如下所示:

word[0] = "sh"
word[1] = "-c"
word[2] = "ls -l | less"
word[3] = NULL

[编辑]或者,您可以执行sHell在内部执行的操作:生成两个进程并使用管道连接它们.这将涉及使用fork(),pipe(),dup2()和execve()调用.但是,调用sHell的工作量要少得多,而且因为交互式程序的数量较少,所以不需要担心性能太高:任何时间不到100毫秒的东西都被认为是瞬时的.

大佬总结

以上是大佬教程为你收集整理的linux execvp; ls无法访问|,没有这样的文件或目录全部内容,希望文章能够帮你解决linux execvp; ls无法访问|,没有这样的文件或目录所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: