Та же программа работает в C, но не в C ++ (использует системные вызовы Linux) - PullRequest
0 голосов
/ 08 ноября 2018

Я должен написать (очень базовую) оболочку для linux для школы. В настоящее время я только пытаюсь выполнить программу с ним (через fork и execv), и только планирую добавить пользовательский ввод позже. Я начал писать на C (который я вообще не знаю / знаю только некоторые части, которые он разделяет с C ++), потому что слайды использовали его, но мы можем использовать либо C, либо C ++, и я планировал использовать C ++, как только я узнал, как C обрабатывает / не обрабатывает ввод / вывод / строки. (Я взял части кода (в основном это строки, в которых используются status, fork, execv и wait) из слайдов профессора и сам добавил его части.)
Однако в настоящее время при использовании C программа компилируется, запускается и, кажется, показывает ожидаемый результат (вывод «testdesecho» путем вызова функции echo). Но когда я копирую тот же код в C ++ и пытаюсь скомпилировать его, я получаю несколько ошибок (не только предупреждений) и поэтому не могу даже скомпилировать код.

Это код

//#include <iostream>

#include <stdio.h>
#include <stdlib.h>

#include <stdio.h>  
#include <ctype.h>
#include <limits.h>
#include <string.h>
#include <stdlib.h>
//#include <unistd.h> 
/*
readparsefunc() {

}
*/


int main() {
    int childPid;

    int status;
    char befehlstr[20] = "/bin/echo";                                                   //location              
    char* parameterstr[61] = { "echo", "testdesecho" };                                 //argv


    childPid = fork();

    //befehlstr = "";                                       
    //parameterstr = " ";
    //cout << parameterstr[1];
    printf("%d", childPid);     printf("<- childPid(test) \n");
    printf(befehlstr);          printf("<- befehlstr(test) \n");
    printf(*parameterstr);      printf("<- parameterstr(test) \n");

    if (childPid == -1) { printf("Konnte keinen neuen Prozess erstellen"); }            
    else if (childPid == 0) {                           
        printf("child process \n");

        int testintueberlagerung = 0;
        testintueberlagerung = execv(befehlstr, parameterstr);
        if (testintueberlagerung != 0) {
            printf("%d" "<- testueberlagerungswert \n", testintueberlagerung);
        }
        //execv(befehlstr, parameterstr);                   

        exit(0);                                        
    }
    else if (childPid > 0) {
        printf("parent process \n");
        wait(&status);                                  
        printf("parent process beendet sich nun auch \n");
    }

    /*
    while (1 != 0) {

    }
    */





    return 0;
}

И это ошибки:

testmitcanders.cpp:27:13: error: ‘fork’ was not declared in this scope
  childPid = fork();
             ^~~~
testmitcanders.cpp:41:26: error: ‘execv’ was not declared in this scope
   testintueberlagerung = execv(befehlstr, parameterstr);
                          ^~~~~
testmitcanders.cpp:51:3: error: ‘wait’ was not declared in this scope
   wait(&status);        
   ^~~~
testmitcanders.cpp:51:3: note: suggested alternative: ‘main’
   wait(&status);        
   ^~~~
   main

Насколько я понимаю, все они относятся к системным вызовам, и я не понимаю, почему они должны быть объявлены в C ++. а не в С? (А как их объявить, если надо?)

Спасибо за любую помощь

1 Ответ

0 голосов
/ 08 ноября 2018

В старых версиях C (которые большинство компиляторов все еще поддерживают по умолчанию) использовалась концепция типа по умолчанию для необъявленных функций. Если функция используется до ее объявления, C предполагает, что тип функции равен int (*)(), то есть функция, которая принимает неизвестное число аргументов и возвращает int. Фактические типы рассматриваемых функций более или менее совместимы с этим определением, поэтому, похоже, оно работает.

C ++, с другой стороны, не имеет типа по умолчанию для необъявленных функций, поэтому он сразу выдает ошибку, когда функция используется без объявления.

Для функций fork и exec вам нужно #include <unistd.h>, а для wait вам нужно #include <sys/types.h> и #include <sys/wait.h>.

...