2014-12-11 3 views
0

Нам было присвоено задание, которое будет выполняться в двух командах от терминала и перенести первое на второе. Я считаю, что структура кода правильная, однако при попытке скомпилировать ее жалуется, что мой начальный символ char * cmd не является допустимым. Почему это происходит? Я смущен, любая помощь будет оценена.C Character Array Pointer не является корректным заявлением

Код:

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

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

    if(pipe(f_des) == -1) 
    { 
     perror("pipe"); 
     exit(1); 
    } 

    switch(fork()) 
    { 
     case -1: perror("fork"); 
      exit(2); 
      case 0: dup2(f_des[1], fileno(stdout)); 
      close(f_des[0]); 
      close(f_des[1]); 
      char *cmd[] = {"/usr/bin/"+argv[1],argv[1], (char *)0}; 
      char *path[] = {"HOME=/usr/home/", "LOGNAME=home", (char *)0}; 
      int ret; 
      ret = execvp(cmd,path); 
      exit(3); 
     case default: dup2(f_des[0], fileno(stdin)); 
      close(f_des[0]); 
      close(f_des[1]); 
      char *cmd[] = {"/usr/bin/"+argv[2], argv[2], (char *)0}; 
      char *path[] = {"HOME=/usr/home/", "LOGNAME=home", (char *)0}; 
      int ret; 
      ret = execvp(cmd,path); 
      exit(4); 
    } 
} 

Ошибка:

cc: Error: lab1.c, line 22: Invalid statement. 
char *cmd[] = {"/usr/bin/"+argv[1],argv[1], (char *)0}; 
^ 
cc: Error: lab1.c, line 22: Missing ";". 
char *cmd[] = {"/usr/bin/"+argv[1],argv[1], (char *)0}; 
-----------------------------------------------------^ 
cc: Error: lab1.c, line 23: Invalid statement. 
char *path[] = {"HOME=/usr/home/", "LOGNAME=home", (char *)0}; 
^ 
cc: Error: lab1.c, line 23: Missing ";". 
char *path[] = {"HOME=/usr/home/", "LOGNAME=home", (char *)0}; 
------------------------------------------------------------^ 
cc: Error: lab1.c, line 24: Invalid statement. 
int ret; 
^ 
cc: Error: lab1.c, line 27: Invalid expression. 
case default: dup2(f_des[0], fileno(stdin)); 
-----^ 
cc: Error: lab1.c, line 30: Invalid statement. 
char *cmd[] = {"/usr/bin/"+argv[2], argv[2], (char *)0}; 
^ 
cc: Error: lab1.c, line 30: Missing ";". 
char *cmd[] = {"/usr/bin/"+argv[2], argv[2], (char *)0}; 
------------------------------------------------------^ 
cc: Error: lab1.c, line 31: Invalid statement. 
char *path[] = {"HOME=/usr/home/", "LOGNAME=home", (char *)0}; 
^ 
cc: Error: lab1.c, line 31: Missing ";". 
char *path[] = {"HOME=/usr/home/", "LOGNAME=home", (char *)0}; 
------------------------------------------------------------^ 
cc: Error: lab1.c, line 32: Invalid statement. 
int ret; 
^ 
cc: Error: lab1.c, line 25: In this statement, "ret" is not declared. 
ret = execvp(cmd,path); 
^ 
cc: Error: lab1.c, line 25: In this statement, "cmd" is not declared. 
ret = execvp(cmd,path); 
-------------^ 
cc: Error: lab1.c, line 25: In this statement, "path" is not declared. 
ret = execvp(cmd,path); 
-----------------^ 
+7

Вы не можете добавить две строки с '+' like '"/usr/bin/"+ argv [1]'. Не составляйте синтаксис только потому, что вы можете сделать это на других языках. –

+3

И похоже, что вы компилируете C89. И это 'default:', а не 'case default:'. – mafso

+0

@YuHao, Спасибо за уведомление, как бы вы предложили сделать это? strcat? – Kyle

ответ

2

Я стараюсь, чтобы удалить ошибки. Я не уверен, что это работает правильно.

char *cmd[] = {"/usr/bin/"+argv[1],argv[1], (char *)0}; 

изменение + как,.

char *cmd[] = {"/usr/bin/",argv[1],argv[1], (char *)0}; 

case dafault: 

в

default: 

И делают случаи, как с в блоке. используя параметры. { }.

При прохождении аргумента в execvp первый аргумент char * не char *[].

Тогда попробуйте этот код. Я не уверен, что это работает, но все ошибки очищаются.

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

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

    if(pipe(f_des) == -1) 
    { 
     perror("pipe"); 
     exit(1); 
    } 

    switch(fork()) 
    { 
     case -1: perror("fork"); 
       exit(2); 
     case 0: { dup2(f_des[1], fileno(stdout)); 
        close(f_des[0]); 
        close(f_des[1]); 
        char *cmd = "/usr/bin/"; 
        char *const path[] = {"HOME=/usr/home/", "LOGNAME=home", (char *)0}; 
        int ret; 
        ret = execvp(cmd,path); 
        exit(3); } 
     default: { dup2(f_des[0], fileno(stdin)); 
        close(f_des[0]); 
        close(f_des[1]); 
        char *cmd = "/usr/bin/"; 
        char *path[] = {"HOME=/usr/home/", "LOGNAME=home", (char *)0}; 
        int ret; 
        ret = execvp(cmd,path); 
        exit(4); } 
     } 
    } 
1

Во-первых, для конкатенации на строки в C/C++, можно использовать функцию strcat(const char *,const char *)<string.h> «s. Во-вторых, второй аргумент для execvp() - const char *argv[]. В-третьих, первый аргумент для execvp() - const char *cmd нет char *cmd[], но char *cmd. Это должна быть одна строка. Кроме того, это default: не case default:, как вы положили в свой код. В-четвертых, вы должны объявить ret, cmd и path/cmdargs вне инструкции переключения.

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

int main(int argc, char *argv[]) { 
int f_des[2]; 

if(pipe(f_des) == -1) 
{ 
    perror("pipe"); 
    exit(1); 
} 

char *cmd; 
char *cmdargs[/*<numcmdargs>*/]; 
int ret; 

switch(fork()) 
{ 
    case -1: perror("fork"); 
     exit(2); 
    case 0: dup2(f_des[1], fileno(stdout)); 
     close(f_des[0]); 
     close(f_des[1]); 
     cmd = strcat("/usr/bin",argv[1]); 
     cmd = strcat(cmd,'\0'); 
     ret = execvp(cmd,cmdargs); 
     exit(3); 
    default: dup2(f_des[0], fileno(stdin)); 
     close(f_des[0]); 
     close(f_des[1]); 
     cmd = strcat("/usr/bin/",argv[2]); 
     cmd = strcat(cmd,'\0'); 
     ret = execvp(cmd,cmdargs); 
     exit(4); 
} 
} 

Примечание: этот код будет компилироваться без предупреждений о clang, но, вероятно, потребуется выполнить некоторые изменения для запуска. (При запуске он дает Bus Error: 10).

Смежные вопросы