2012-10-11 49 views
0

我有三個進程,一個父親和兩個兒子,因爲兒子通過遺產獲得了我分叉之前創建的所有東西我如何訪問數組我之前從兒子或父親創造的絃樂? 我想訪問我之前創建的兩個字符串數組,它們是來自兒子和父親的string_hashes和哈希的名稱? 感謝您的幫助...訪問字符串從C程序中創建的子進程之前創建的字符串

#include <unistd.h> 
#include <sys/wait.h> 
#include <sys/types.h> 
#include <stdio.h> 
#include <strings.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <errno.h> 




#define PIPE_NAME "np_workmaster" 
#define max_chars_string 1000 
#define n_childs 2 

typedef struct 
{ 
    int a; 
    int b; 
} numbers; 



pid_t childs[n_childs]; 

void read_lines(char * filename, char (*pointer)[max_chars_string],int init_read,int n_lines); 
void get_strings_hash(char (*pointer_strings)[max_chars_string],char (*pointer_hashes)[max_chars_string],int total_lines); 

void worker(){ // meter as funcoes de ler passwords no filho 
    char * ant = ""; 
    char hash_char; 

    printf("[%d] I'm the son!\n", getpid()); 
    printf("[%d] My parent is: %d\n", getpid(), getppid()); 
    exit(0); 
} 

void pparent(){// sera o ultimo processo a terminar mostrando as passwords ja recebidas do dispatcher que recebe dos outros filhos 
    printf("[%d] I'm the father!\n", getpid()); 
    //dispatcher() // criar funcao dispatcher que envia dados ao outro processo... 

    int fd; 
    if ((fd=open(PIPE_NAME, O_WRONLY)) < 0) 
    { 
    perror("Cannot open pipe for writing: "); 
    exit(0); 
    } 

    // Do some work 
    while (1) { 
     // here i want to access arrays strings_hashes and hashes from the father and sons 

    printf("[CLIENT] Sending (%d,%d) for adding\n", n.a, n.b); 
    write(fd, &n, sizeof(numbers)); 
    sleep(2); 
    } 

    return 0; 

} 






int main(int argc, char **argv) 
{ 
    char *filename; 
    int status;//status do processos filho 
    int resources[2];// numero de linhas que cada processo tem de ler 
    //char * chave_iniciadora = ""; 
    int n_lines; //numero de linhas do ficheiro 
    int i = 0; 



    filename = (char*)malloc(strlen(argv[1])*sizeof(char)+1); 

    if(argc !=3){ 
     fprintf(stderr, "Usage : %s [text_file] [cores]",argv[0]); 
     exit(0); 
    } 

    strcpy(filename,argv[1]); 
    n_lines = count_lines(filename); // contem o numero de linhas 
    //definicao arrays 
    char strings_hashes[n_lines][max_chars_string];//aray de string com as strings lidas do ficheiro 
    char hashes[n_lines][max_chars_string]; // array de strings com as hashes 
    char * pointer_string = &strings_hashes[0][0]; // ponteiro para o inicio do array das strings lidas do ficheiro 
    char * pointer_hashes = &hashes[0][0];//ponteiro para o inicio do array das hashes 

    //funcoes 
    share_resources(atoi(argv[2]),n_lines,resources); 
    read_lines(filename,strings_hashes,0,n_lines); // le as strings do ficheiro e passa para o array 
    get_strings_hash(strings_hashes,hashes,n_lines); 
    // 
    for(i = 0; i<n_lines;i++){ 
     printf("%s",strings_hashes[i]); 
    } 
    for(i = 0; i<n_lines;i++){ 
     printf("%s",hashes[i]); 
    } 

    // 
    for(i = 0; i <atoi(argv[2]);i++){ 
     childs[i] = fork(); 
     if(childs[i] == -1){ 
      perror("Failed to fork"); 
      return 1; 
     } 
     if (childs[i] == 0) 
     { 
      worker(); 
     } 
     else 
     { 
      pparent(); 
      wait(&status); 
      if (!status) 
      printf("\nOK\n"); 
      else 
      printf("\nSomething is wrong...\n"); 
    } 
    } 
    return 0; 
} 



/////////////////////////////////////////////////////////////////// 



//funcionar 
void get_strings_hash(char (*pointer_strings)[max_chars_string],char (*pointer_hashes)[max_chars_string],int total_lines)//vai ao array de strings e corta a parte de hash e mete num array 
{ 
    int i = 0; 
    char *strings; 
    char *hash; 

    for(i = 0;i<total_lines;i++){ 
      strings = (char*)malloc(strlen(pointer_strings)*sizeof(char)+1); 
      strcpy(strings,*pointer_strings); 
      hash = (char*)malloc(strlen(pointer_strings)*sizeof(char)+1); 
      find_hash(strings,hash); 
      strcpy(*pointer_hashes,hash); 
     pointer_hashes++; 
     pointer_strings++; 
    } 

} 



//funcionar 
int count_lines(char * filename){ 
    FILE *fp; 
    char str[max_chars_string]; 
    int i =0; 

    if((fp = fopen("ficheiro_leitura.txt", "r"))==NULL) { 
     printf("Cannot open file.\n"); 
     exit(1); 
    } 

    while(!feof(fp)) { 
     while(fgets(str, sizeof str, fp)) { 
      i++; 
     } 

    } 
    fclose(fp); 
    return i; 
} 
//funcionar 
void read_lines(char * filename, char (*pointer)[max_chars_string],int init_read,int n_lines){ 
    FILE *fp; 
    char str[max_chars_string]; 
    int i =0; 


    if((fp = fopen(filename, "r"))==NULL) { 
     printf("Cannot open file.\n"); 
     exit(1); 
    } 

    if(init_read>0 && init_read<=n_lines){ 
    for(i = 0;i<init_read;i++){ 
     fgets(str, sizeof str, fp); 
     for(i = init_read;i<n_lines;i++){ 
      fgets(str, sizeof str, fp); 
      strcpy(*pointer, str); //copia para a posicao actula do ponteiro 
      pointer++; 
     } 
    } 
    } 
    if(init_read<=n_lines && init_read==0){ 
     for(i = init_read;i<n_lines;i++){ 
      fgets(str, sizeof str, fp); 
      strcpy(*pointer, str); //copia para a posicao actula do ponteiro 
      pointer++; 
     } 
    } 


    fclose(fp); 

回答

0

您不必做任何特殊的事情。目前,您在main()中定義了它們。要麼全局定義它們,要麼將它們傳遞給worker()(即子)函數。

請記住,它們現在是同一事物的3個獨立副本,所以如果一個進程更改它們,那些更改將不會反映在其他進程中。如果這是你的意圖,那麼將它們放在共享內存中並用互斥鎖保護它們可能是最容易的。

+0

感謝您的幫助......我剛纔那樣做...... – exceltior