Tag: shell

MSYS2:如何禁用路径名到驱动器号的自动转换?

在MSYS2 shell中测试用mingw编译的C程序时,我遇到了一个问题:我编写了一个命令行解析器,它根据windows约定接受选项(以/开头)。 如果我这样调用我的程序来生成输出文件: ./example.exe /o test 最终在argv[1]中的结果实际上是O:/ 。 从运行CMD.EXE的控制台窗口进行测试时,它可以正常工作。 这个真正最小的程序演示了这种行为 #include int main(int argc, char **argv) { if (argc > 1) { puts(argv[1]); } return 0; } $ ./example.exe /o O:/ 所以我想这是MSYS2 shell试图提供帮助,并将类似于root下面的单字母路径的内容替换为驱动器字母语法。 有没有办法禁用此行为? 总是启动CMD.EXE进行测试有点麻烦。

SIGCHLD导致分段错误,而不是进入处理程序

我正在尝试创建一个简单的shell,并添加了使用&在后台运行进程的function。 在我的主要方法中,我基本上有: int main() { if (signal(SIGCHLD, handle) == SIG_ERR) perror(“Cannot catch SIGCHLD”); pid_t child = fork(); if (child == 0) execvp(command, arguments); else { if (background == 1) { printf(“1”); backgroundList(command, child); printf(“2”); } else waitpid(child, NULL, 0); } } 对于我的经纪人,我有: void handle(int s) { printf(“a”); if (signal(SIGCHLD, handle) == SIG_ERR) perror(“Cannot catch SIGCHLD”); […]

如何在C中创建一个虚拟shell?

我有一个带有参数的虚拟shell程序。 但是,我希望它不带参数,而是提示让用户输入可执行程序和参数的名称。 例如: $dummyshell >(executable program and parameters go here) 这是我到目前为止的代码: #include #include #include #include #include #include #define BUFFER_SIZE 1<<16 #define ARRAY_SIZE 1<= &bufCmdArgs[cmdArgsSize])) break; } for (p=n=0; bufCmdArgs[n]!=NULL; n++){ if(strlen(bufCmdArgs[n])>0) cmdArgs[p++]=bufCmdArgs[n]; } *nargs=p; cmdArgs[p]=NULL; } int main(int argc, char *argv[], char *envp[]){ char buffer[BUFFER_SIZE]; char *args[ARRAY_SIZE]; char hflag = ‘N’; int *retStatus; size_t nargs; […]

在虚拟shell中处理CTRL-C

我正在编写一个虚拟shell,当用户输入ctrl-C时它不应该终止,但是应该只生成一个新的提示行。 目前,当我输入ctrl-C时,我的shell不会终止,但它仍然不会打印新的提示行。 你知道为什么会这样,我怎么解决这个问题? 我的代码如下: #include #include #include #include #include #include #include #define BUFFER_SIZE 1<<16 #define ARRAY_SIZE 1<= &bufCmdArgs[cmdArgsSize])) break; } for (p=n=0; bufCmdArgs[n]!=NULL; n++){ if(strlen(bufCmdArgs[n])>0) cmdArgs[p++]=bufCmdArgs[n]; } *nargs=p; cmdArgs[p]=NULL; } void INThandler(int sig) { printf(“\n> “); signal(sig, SIG_IGN); } int main(void) { char buffer[BUFFER_SIZE]; char *args[ARRAY_SIZE]; int retStatus; size_t nargs; pid_t pid; printf(“$dummyshell\n”); signal(SIGINT, INThandler); […]

Fork永远不会进入孩子的过程

我正在编写一个模仿shell行为的代码,特别是&和|。 我的函数接收用户命令,并检查是否有&在最后,然后子进程应该在后台运行,父进程不应该等待它完成并继续执行命令。 它也应该检查是否有| 在输入数组中运行两个子进程,同时管道他们的stdin和stdout。 我已经实现了&的行为,但每当我编译并运行我的代码时,我只从父进程中获取printf语句。 我想听听如何解决这个问题的想法,此外,我将不胜感激任何关于|的实施的建议 (管道)以及如何防止僵尸。 int process_arglist(int count, char** arglist) { int pid = fork(); printf(“%d”, pid); switch (pid) { case -1: fprintf(stderr, “ERROR: fork failed\n”); return 1; break; case 0: // Son’s proccess printf(“I got to son”); //check last arglist argument if (strcmp(arglist[count – 1], “&”) == 0) { setpgid(0, 0); arglist[count […]

命令行* linux

我正在尝试用C编写代码,它实现了一个简单的计算器。 输入应该来自命令行,所以例如我运行时 ./calculator 5 * 2 结果应该是10 问题是,当我写*它显示当前目录中的所有文件,并且该程序表现不佳。 无论如何都要克服这个问题? 我试图在这里或其他网站找到解决方案,但没有成功。 我需要*将被解释为char而不是linux命令。 谢谢。

仅在修改main.c时才从脚本调用make

问题:我想只运行一个脚本(例如run.sh),它将决定是否应该调用make (并在需要时调用它)然后运行可执行文件。 我的项目只有一个文件,即main.c. 然而,只是链接让我等了一点,我调试时不喜欢的东西,我渴望程序运行。 我希望这样的东西进入run.sh: #!/bin/bash if[ main.c has changed from the last time make was called] then make > compile.txt fi ./a.out 这样只有在修改main.c时才会调用make 。 通过修改,可以认为时间戳已更改(即使这可能不是实际标准)。 这可行吗? 如果是这样,我看到了这个答案 ,这让我觉得每次进入调用make的if语句的主体时,都会创建main.c的副本,或者存储文件的时间戳(在文件中)也许),以便下次脚本运行时,它将恢复该信息并检查if条件以查看时间戳是否不同。 那么,第二个问题是,如何做到这一点?

如何将命令行参数从C程序传递给bash脚本?

我写了一个bash脚本,现在我从C程序调用这个脚本。 现在我想从命令行将参数,即argv[1]和argv[2]传递给脚本。

将多个文件(gz)传送到C程序中

我编写了一个C程序,当我使用stdin将数据传输到我的程序时,它可以工作: gunzip -c IN.gz|./a.out 如果我想在文件列表上运行我的程序,我可以这样做: for i `cat list.txt` do gunzip -c $i |./a.out done 但这将启动我的程序’文件数’次。 我有兴趣将所有文件传递到同一个进程中。 喜欢做 for i `cat list.txt` do gunzip -c $i >>tmp done cat tmp |./a.out 我怎样才能做到这一点?

c中的简单shell:waitpid系统调用无法正常工作

我必须创建简单的shell来读取命令并按顺序执行它们。 condition不会改变main函数的forms,而execute函数应该是递归的。 主要问题是,似乎waitpid不起作用。 但我知道,我的代码中存在很多问题。 请让我知道我应该从哪里开始.. #include #include #include #include #include #include #define MAX 10 char cmmd[MAX][256]; int sp; char *argv[10]; int size; void ClearLineFromReadBuffer(void){ while(getchar() != ‘\n’); } void printCommands(){ size = sp+1; //print by moving stack pointer while(1){ if (sp==-1) break; printf(“Command line : %s\n”, cmmd[sp]); sp–; } printf(“print end\n”); } void readCommandLines(){ int […]