C程序不执行main之外的功能

时间:2015-06-27 12:25:17

标签: c system-calls

如果我在另一个C程序中执行exec()函数作为主函数它完美地工作,而如果我把它作为主菜单中调用的函数,它会给我一些警告,并且函数不会运行。

我的代码:

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

int exec (void) {

        char array[100];
        char character;
        int i = 0;
        char* point;
        int j = 0;

        printf ("Digita una stringa");
        printf ("\n");
        do {
            character = getchar();
            array[i] = character;
            i++;
        }
        while (character != '\n');
        array[i-1] = '\0';
        i = 0;

        char* string[100];

        char *word = strtok(array, " .");
        j = 0;
        while (word != NULL) {
            printf("%s\n", word);
            string[j++] = word; // Increment j
            word = strtok(NULL, " .");
        }
        string[j] = NULL; // Make sure the array is NULL term

        printf ("\n");  

    pid_t  pid;
    pid = fork();
    int status;

    if (pid == -1) {
        perror("");
    }else if (pid == 0) {
        execvp(string[0], string);     /* execute the command  */
                fprintf(stderr, "Failed to exec");  
                exit(1);
            }
    else {

        //.. wait until the child ends
        waitpid(-1, &status, 0);
      }

return;
}

int read_input (void) {
    int choice;
    printf("Seleziona una voce dal menu");
    do {    
        printf("\n");
        scanf ("%i", &choice);
        if (choice > 8 || choice < 1)
            printf ("Attenzione, inserisci un valore contemplato dal menu");
    }
    while ( choice > 8 || choice < 1);

return choice;
}

void main (int argc, char *argv[]) {

    printf ("------------------------\n");
    printf ("          MENU         \n");
    printf ("------------------------\n");
    printf ("  \n");
    printf ("1) Esecuzione in foreground di un processo\n");
    printf ("2) Ctrl -C\n");
    printf ("3) Exit\n");
    printf ("4) Background\n");
    printf ("5) Pipe\n");
    printf ("6) Jobs\n");
    printf ("7) fg\n");
    printf ("8) kill\n");
    int menu = read_input();
    switch (menu) {

        case '1' :  
                exec ();
                break; 
        case '2' :
                //ctrl();
                break;
        case '3' :
                //exit_();
                break; 
        case '4' : 
                //background();
                break;
        case '5' :
                //pipe();
                break;
        case '6' : 
                //jobs();
                break;
        case '7' : 
                //fg();
                break;
        case '8' : 
                //kill();
                break;
    }
}

这是警告:

elaborato.c:31:16: warning: initialization makes pointer from integer without a cast [enabled by default] char *word = strtok(array, " ."); 

4 个答案:

答案 0 :(得分:2)

关于与输入相关的问题,

do {    
    printf("\n");
    scanf ("%i", &choice);
    if (choice > 8 || choice < 1)
        printf ("Attenzione, inserisci un valore contemplato dal menu");
}
while ( choice > 8 || choice < 1);

输入一个整数并按Enter键后,scanf()将消耗该数字,并在stdin中保留换行符。下一次循环(假设输入&lt; 1或&gt; 8或其他东西),scanf获得该换行符并继续。 在getchar()之后添加scanf()

答案 1 :(得分:1)

答案在警告中,你应该将他们从评论中移到问题中。

elaborato.c:31:16: warning: initialization makes pointer from integer without a cast [enabled by default] char *word = strtok(array, " ."); 

这意味着word,即char指针正在从整数初始化。因此,似乎strtok()返回一个整数......听起来不对。

来自strtok()手册页:

#include <string.h> 

char *strtok(char *str, const char *delim);

char *strtok_r(char *str, const char *delim, char **saveptr);

这似乎是正确的,它会返回一个char * ....但它也表示它已在<string.h>中声明...您不包括在内。由于未定义,编译器将其假定为int strtok()

修复:添加#include <string.h>行。

答案 2 :(得分:0)

您遇到的问题是scanf被跳过。

有关详细信息,请参阅here

scanf()消费换行符之后调用printf并继续,用户无需输入任何内容。

它从标准输入读取下一个字符,这可能是换行符,因此不会提示您输入任何内容。

答案 3 :(得分:0)

我太累了,无法对整个代码发表评论(这真的很糟糕),所以我只是写下有问题的问题,以及如何平凡调试它

要做的第一件事就是检查我们是否得到了数字并返回main,因此:

int menu = read_input();
printf("got [%d]\n", menu);

运行此:

[snip]
1
got [1]

所以我们确实达到了这一点。

现在,我们检查这是什么。

int menu = read_input();
printf("got [%d] '1'=[%d]\n", menu, '1');

让我们运行:

1
got [1] '1'=[49]

因此,菜单存储一个整数1,而&#39; 1&#39; 是ascii中1的字符代码,嗯,不是整数1。

总的来说,我不知道缩小它的问题是什么。