我正在尝试编写一个关于使用execlp()命令从$PATH执行程序的进程的代码。(它不需要是execlp命令,但我发现它对这个命令很有用)我已经实现了预期的输出,但我需要运行多个命令。更具体地说,我希望子进程运行exec命令,然后父进程打印一个文本,指示它准备接受另一个命令。然后子进程将运行new exec命令。我的代码是:

int main ( int argc, char *argp[]) {
pid_t progpid = fork(); // the fork command for the creation of the child process
int status = 0;
char com[256];

if (progpid < 0)  // the check in case of failure
   {
    printf("PROGRAM ABORTED!");
    return 0;
   }
do
   {
    if (progpid == 0)  // the child process
      {
       scanf( "%s", com);
         if (com == "exit")
          {
            exit(0);
          }
        else
            {
               execlp(com, com, NULL);
            }
      }
else //the parent process
    {
      wait(&status);
      printf("$");
    }
}while (com != "exit");
return 0;
}

预期产出为:
<program which I input from keyboard> ( for example  : ls )
<output of the program>
$<next program>
<output of the next program>
.
.
.
$exit

总之,我想一直运行程序,直到我进入退出,它结束,而不做任何其他事情。但是我得到的结果是:
<program>
<output of program>
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

它一直在印$,直到我把它关掉。我是新来的进程,所以请不要对我的代码太苛刻到目前为止。
提前谢谢你!

最佳答案

这个

if (com == "exit")

应该是
if (strcmp(com, "exit") == 0)

同样改变while条件。
在C语言中,字符串比较是使用strcmp()完成的。==在您的示例中,只需比较com的地址和字符串文本"exit"的地址。(在表达式中,数组被转换为指向其第一个元素的指针。因此,“地址”比较。另请参见:What is array decaying?)。
请注意,您的execlp()呼叫有问题。NULL可以定义为0,在这种情况下,作为变量函数的execlp()可以将其识别为最后一个参数。
我建议改成:
execlp(com, com, (char*)0);

您还需要通过检查其返回代码来检查wait()是否失败。
这是一个简单的例子,基于你的改进错误检查。
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main ( int argc, char *argp[]) {

for(;;) {
    char com[1024];
    printf("$ ");
    fgets(com, sizeof com, stdin);
    com[strcspn(com, "\n")] = 0; /* Remove if there's a newline at the end */

    if (strcmp(com, "exit") == 0) {
       exit(0);
    }

    pid_t pid = fork();
    if (pid < 0) {
        perror("fork");
        exit(1);
    }

    if (pid == 0) { /* child process */
       execlp(com, com, (char*)0);
    }

    int status;
    int rc = wait(&status);
    /* You can inspect 'status' for further info. */
    if (rc == -1) {
        perror("wait");
        exit(1);
    }
}

return 0;
}

请注意,如果要执行带参数的命令,则需要进行参数处理。

关于c - C中的过程循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40363123/

10-13 07:20