我正在尝试编写一个关于使用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/