为什么使用fgets()读取的命令不能与execlp()一起使用,但硬编码的相同命令是否正常工作?

时间:2015-04-18 01:02:44

标签: c linux

我有C程序,我正在阅读用户输入并在子进程中运行它。但不知何故,execlp并没有在控制台上打印任何内容。当我使用execlp(" ls"," ls",NULL)时,它工作正常,但使用用户输入不会在控制台上打印任何内容。

守则

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main()
{
    char str[1024];
    printf("This program forks a Unix process and execute a command string.\n");
    printf("Enter command string:");
    fgets(str,sizeof(str),stdin);

    printf("entered string %s",str);
    int BeforeparentID=getpid();

    printf("\nParent process ID before fork():%d",BeforeparentID);

    int cid =fork();
    int AfterparentID=getpid();
    printf("\nParent process ID after fork():%d",AfterparentID);
    printf("\nChild process ID afterr fork():%d\n",cid);

    sleep(1);
    if(cid==0){
        execlp(str,str,NULL); //this does not print anything
    }
    else{
        sleep(1);
        waitpid(cid,0,0);
    }
}

示例执行

This program forks a Unix process and execute a command string.
Enter command string:ls
entered string ls

Parent process ID before fork():15368
Parent process ID after fork():15368
Child process ID afterr fork():15369
Parent process ID before fork():15368
Parent process ID after fork():15369
Child process ID afterr fork():0

就是这样;没有目录列表。为什么呢?

1 个答案:

答案 0 :(得分:3)

输入ls时,您不会发送相同的内容。您使用换行符'\n')完成该输入,其中fgets 保留在输入字符串的尾部。因此,您实际上正在执行:

execlp("ls\n", "ls\n", NULL);

由于你没有检查执行execlp的结果(很多人不会,但它会在这里教育,因为它会表明错误),你不要&#39 ;看到问题并简单地假设它有效(错误我对冲你现在做得更少的赌注; 检查你的退货结果)。

从输入字符串中修剪换行符:

char *nl = strrchr(str, '\n');
if (n1)
    *n1 = 0;

然后将其发送到execlp

祝你好运。