我有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
就是这样;没有目录列表。为什么呢?
答案 0 :(得分:3)
输入ls
时,您不会发送相同的内容。您使用换行符'\n'
)完成该输入,其中fgets
保留在输入字符串的尾部。因此,您实际上正在执行:
execlp("ls\n", "ls\n", NULL);
由于你没有检查执行execlp
的结果(很多人不会,但它会在这里教育,因为它会表明错误),你不要&#39 ;看到问题并简单地假设它有效(错误我对冲你现在做得更少的赌注; 检查你的退货结果)。
从输入字符串中修剪换行符:
char *nl = strrchr(str, '\n');
if (n1)
*n1 = 0;
然后将其发送到execlp
。
祝你好运。