我正在尝试在C中创建一个简单的shell程序.我需要它做的是为用户提供一个可以运行其他本地程序的提示.我可以使用fork()来完成该部分,其中父进程在子进程上等待(),而子进程execvp()是程序.
但是,如果'&'字符附加到用户命令的末尾,我需要他们的程序在后台运行,这意味着我需要父进程不等待子进程,而是立即将提示返回给用户,同时允许后台进程继续运行,但不允许它在屏幕上显示任何内容.我只是想通过ps命令检查它是否仍然存在.
我试图理解使用fork()创建子项的想法,然后让子fork()再次创建一个类的孙子,然后立即退出() - 子进程.即,孤儿孙子.据说这允许父母仍然等待孩子,但由于孩子几乎立即有效地结束,它就像它不等待?关于僵尸疯狂的事情?我不知道.我遇到过的几个网站似乎都建议将其作为在后台运行流程的一种方式.
但是,当我尝试这样做的时候,我发现程序流程发生了很多事情,"背景"过程继续在屏幕上显示输入,我真的不知道从哪里开始.
这是我对代码的实现,我确信这是非常错误的.我只是想知道这整个孙子的事情是否是我需要采取的路线,如果是这样,我的代码有什么问题?
36 int main(int argc, char *argv[])
37 {
38 char buffer[512];
39 char *args[16];
40 int background;
41 int *status;
42 size_t arg_ct;
43 pid_t pid;
44
45 while(1)
46 {
47 printf("> ");
48 fgets(buffer, 512, stdin);
49 parse_args(buffer, args, 16, &arg_ct);
50
51 if (arg_ct == 0) continue;
52
53 if (!strcmp(args[0], "exit"))
54 {
55 exit(0);
56 }
57
58 pid = fork(); //here I fork and create a child …Run Code Online (Sandbox Code Playgroud) 我搜索过高低,但找不到我认为是一个相当简单的问题的答案.我对C很陌生,由于在这个项目中给我的限制,我在弄清楚如何做到这一点时遇到了一些麻烦.
我试图从文本文件中读取文本,并将该数据存储在数组中.很简单.但是,我不得不使用命令行运算符'<'并将stdin重定向到文本文件.
我似乎能够弄清楚如何正确打开文件并执行后续操作的唯一方法如下:
#include <stdio.h>
FILE *fr;
main()
{
fr = fopen ("mytext.txt", "r"); /* open the file for reading */
Run Code Online (Sandbox Code Playgroud)
问题是我似乎无法将fopen()的第一个参数作为stdin'<'提供的文件名.它只有在我为参数显式键入字符串时才有效.例如,如果我要跑
myprog.o < mytxt.txt
Run Code Online (Sandbox Code Playgroud)
我怎么能将该stdin重定向提供的文本文件的名称传递给fopen函数?或者有不同的/更好的方式来做我想做的事情?
提前致谢.