2016-10-02 5 views
0

Я застрял на том, что на последних двух часах работаю между двумя программами, и я застрял и не уверен, что я делаю что-то неправильно. Идея моей программы заключается в том, что я собираюсь использовать interface.c, чтобы открыть трубку, а затем выполнить db.c. Я хочу использовать две трубки для связи между двумя различными программами. Теперь, когда interface.c является «parent» и db.c является «дочерним», я не уверен, правильно ли передаю параметры в мой канал с помощью команды execl. Все компилируется правильно, но когда я пытаюсь запустить программу интерфейса, я получаю сообщение об ошибке: «Bad File Number». Возможно ли, что я неправильно использую трубы? В настоящее время я просто пытаюсь заставить свою программу отправлять целое число, значение по каналу на db.c. Любая помощь приветствуется.Трубопровод между двумя программами в C

Код для interface.c

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <errno.h> 
#include <sys/wait.h> 
//PIPES: 
// 
//Parent: reads from P1_READ, writes on P1_WRITE 
//Child: reads from P2_READ, writes on P2_WRITE 
#define P1_READ  0 
#define P2_WRITE 1 
#define P2_READ  2 
#define P1_WRITE 3 

// the total number of pipe *pairs* we need 
#define NUM_PIPES 2 

int main(int argc, char *argv[]) 
{ 
    //Create Pipe Array 
    int fd[2*NUM_PIPES]; 

    //For Parameter Passing: 
    char param0[20];  //P1_Read 
    char param1[20];  //P2_Write 
    char param2[20];  //P2_Read 
    char param3[20];  //P1_Write 

    snprintf(param0, sizeof(param0), "%d" , fd[0]); 
    snprintf(param1, sizeof(param1), "%d" , fd[1]); 
    snprintf(param2, sizeof(param2), "%d" , fd[2]); 
    snprintf(param3, sizeof(param3), "%d" , fd[3]); 

    //Variables 
    pid_t pid; 
    int val = 42; 

    //Allocate the PIPES 
    for (int i=0; i<NUM_PIPES; ++i) 
    { 
     if(pipe(fd+(i*2)) < 0) 
     { 
      perror("Failed to allocate the pipes"); 
      exit(EXIT_FAILURE); 
     } 
    } 

    //If the fork of the program does not work: 
    if ((pid = fork()) < 0) 
    { 
     perror("Failed to fork process"); 
     return EXIT_FAILURE; 
    } 



    if(pid == 0) 
    { //Child Process 
     execl("./db", "db", param0, param1, param2, param3, (char *)NULL); 
    } 
    else 
    { //Parent Process 

     //SENDING VALUES HERE 
     close(fd[P2_READ]); 
     close(fd[P2_WRITE]); 
     printf("Interface is sending|%d| to DB\n", val); 
     if(write(fd[P1_WRITE],&val, sizeof(val)) != sizeof(val)) 
     { 
      perror("Interfae failed to send value to DB"); 
      exit(EXIT_FAILURE); 
     } 
    } 

    return 0; 
} 

Это для db.c

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <errno.h> 
#include <sys/wait.h> 
#include <sys/types.h> 
//Typedef-Class- 
typedef struct Information 
{ 
    int accountId; 
    int checkNumber; 
    int date; 
    float amount; 
} Information; 

int main(int argc, char *argv[]) 
{ 
//For Input 
    //Account Data 
    Information acctData[25]; 
    int dataStorageLooper = 0;  //How many db entries 

    //For File Input 
    int aVal; 
    int bVal; 
    int cVal; 
    float dVal; 

    //Prepare for file input: 
    FILE * fp; 
    fp = fopen ("accountData.txt", "r"); 

    //Reads Input 
    while(1) 
    { 
     if (fscanf(fp, "%d %d %d %f", &aVal, &bVal, &cVal, &dVal)!=4) 
     { 
      break; 
     } 
     //Puts data into appropriate arrays 
     acctData[dataStorageLooper].accountId= aVal; 
     acctData[dataStorageLooper].checkNumber= bVal; 
     acctData[dataStorageLooper].date= cVal; 
     acctData[dataStorageLooper].amount= dVal; 
     dataStorageLooper++; 
    } 

    //Decrement index to point to last item 
    dataStorageLooper--; 

    //Displays all values 
    printf("\nDisplaying AccountData.txt\n"); 
    for(int i = 0; i < dataStorageLooper; i++) 
    { 
     printf("Line|%d|: Account|%d|: Check|%d|: Date|%d|: Amount|%.2f|\n",i,acctData[i].accountId,acctData[i].checkNumber,acctData[i].date,acctData[i].amount); 
    } 
    //Closes File 
    fclose(fp); 
//End Input 

//Parameter Receiving: 
    int pipes[4];   //Pipe Array 
    int value = 7; 
    int test; 

    //Build the pipes 
    pipes[0] = atoi(argv[1]);  //P1_Read 
    pipes[1] = atoi(argv[2]);  //P2_Write 
    pipes[2] = atoi(argv[3]);  //P2_Read 
    pipes[3] = atoi(argv[4]);  //P1_Write 

    //Troubleshooting  
    printf("The number of parameters: %d\n",argc); 
    printf("Parameter 1: %s\n", argv[0]); 
    printf("I stared correctly\n"); 

    //Testing 
    close(pipes[0]); 
    close(pipes[3]); 

    //SHOULD RECEIVE VALUE HERE 
    test = read(pipes[2], &value, sizeof(value)); 

     if (test < 0) 
     { 
      perror("DB: Failed to read data from parent"); 
      exit(EXIT_FAILURE); 
     } 
     else if (test == 0) 
     { 
      //Unexpected 
      fprintf(stderr, "DB: Read End-Of-File from pipe"); 
     } 
     else 
     { 
      //What did the child receive? 
      printf("DB: Received Value:(%d)\n", value); 
     } 
     close(pipes[2]); 
     close(pipes[1]); 




    return 0; 
} 
+0

Я ответил на вопрос о 'interface.c' и' db.c' день или два назад - хммм, да, есть [отправка и получение символьного массива с использованием piping через argv в C] (http: // stackoverflow.com/questions/39714636/sending-and-receiving-character-array-using-piping-through-argv-in-c/). Разный пользователь, но .... Помогает ли там ответ? Это дает вам кому-то поговорить? –

ответ

0

Одна из вещей, которые вы делаете неправильно это snprintf ИНГ значение различных элементов в fd перед вы присвоили им какое-либо значение. Это неопределенное поведение, а значения, которые вы передаете как параметры, совершенно бессмысленны (в лучшем случае).

Это, пожалуй, очень странный способ сделать что-то. Обычно вы должны просто dup2 fds 0 и 1, чтобы stdin и stdout ребенка были перенаправлены на соответствующие fds.

+0

Я пытался передать параметры для доступа к трубе в db.c. Я пропустил их неправильно? – SunBurntIcarus

+0

@sunburst: как я уже сказал, когда вы вызываете 'snprintf (param1, sizeof (param1),"% d ", fd [0]);', 'fd [0]' еще не присвоено значение, поэтому печать это значение является неопределенным поведением. – rici

+0

Да, это была моя проблема .... Спасибо, хотя! – SunBurntIcarus

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