execv等待输入输入而不是执行程序

时间:2016-02-06 19:36:52

标签: c linux exec

我有一个名为“test”的程序,它执行另一个名为“hello”的程序。在收到所需程序的名称后,我的程序似乎等待更多输入以显示“hello”程序代码。一段示例代码

#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h> /* for fork */
#include <sys/wait.h> /* for wait */
int main()  {

    char *temp[] = {NULL,NULL,NULL,NULL};
    char  buf[BUFSIZ];
    char s[256];

    while(1) {

        printf("type r at next input\n");
        fgets(buf, sizeof(buf), stdin); 
        strtok(buf, "\n");

        if((strcmp(buf,"r")) == 0) { //if r typed
            printf("run what file : ");
            scanf("%s ",s);

            pid_t i = fork();
            if (i == 0) //we are in child process
            {
                execv(s,temp);
                _exit(1);
            }
            if (i != 0) { //parent
                wait(NULL);
            }
        }
        else
            exit(0);
    }
}

“你好”程序是......

#include<stdio.h>

main(int argc, char* argv[])
{
    printf("\nHello World\n");

}

从linux上的shell运行示例是...... *表示我的输入,//是评论

issac@issac-ThinkPad-T440s ~$ ./a.out
type r at next input
*r*
run what file : *hello*
*r*    //i cant proceed unless i type a character so i input *r*?

Hello World    //after ?additional? input it finally displays the "hello" program code
type r at next input    //loops back but program skips my input?
run what file ex ? hello : 

我意识到这可能是一个简单的错误,但我无法弄清楚这是错误的。我意识到跳过输入的最后一部分可能是由于输入缓冲区中有换行符,但更令人困惑的是为什么在执行“hello”后我的程序等待更多输入来显示结果。

1 个答案:

答案 0 :(得分:0)

要回答您的第一个问题:在scanf()中删除一个尾随空格,使其如下所示:scanf("%s",s);

要回答第二个问题:您的问题是混合scanf()fgets()。换行符消费为scanf(),并作为新输入传递给下一个(非第一个)fgets。最简单的解决方案是在两个地方使用fgets

#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h> /* for fork */
#include <sys/wait.h> /* for wait */
#include <string.h>

int main()  {

    char *temp[] = {NULL,NULL,NULL,NULL};
    char  buf[BUFSIZ];
    char s[256];

    while(1) {
        printf("type r at next input\n");
        fgets(buf, sizeof(buf), stdin);
        strtok(buf, "\n");

        if((strcmp(buf,"r")) == 0) { //if r typed
            printf("run what file : ");
            fgets(s, sizeof(s), stdin);
            strtok(s, "\n");
            pid_t i = fork();
            if (i == 0) //we are in child process
                {
                    execv(s,temp);
                    _exit(1);
                }
            if (i != 0) { //parent
                wait(NULL);
            }
        }
        else
            exit(0);
    }
}