2016-05-04 4 views
0

Ich möchte gemessene Daten über eine Struktur vom Kindprozess zum Parent senden. Der Elternprozess muss den Durchschnitt von 10 gemessenen Daten drucken.pipe() senden struct von Kind zu Eltern. Hieroglyphe in read();

struct Die Daten in funcs.h:

struct data{ 
int nr; 
float temp; 
float bst; 
float abst; 
}; 

uebung2_1.c (Haupt):

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <math.h> 
#include <time.h> 
#include <signal.h> 
#include <stdio.h> 
#include "funcs.h" 

#define READ_END 0 
#define WRITE_END 1 
#define CHILD "./sohn" 

int main(){ 
    int w_status, pid_fork, i, k; 
    double midT, midB, midA; 
    int pfd[2]; 
    struct data buf; 

    if(pipe(pfd) == -1){ 
     perror("ERROR creating a pipe\n"); 
     exit(EXIT_FAILURE); 
    } 

    pid_fork = fork(); 
    switch(pid_fork){ 
     case(-1): 
      perror("fork()"); 
      return EXIT_FAILURE; 
     case(0): 
      dup2(pfd[WRITE_END], STDOUT_FILENO); 
      close(pfd[READ_END]); 
      execlp(CHILD,CHILD,NULL); 
      perror("exec is failed"); 
      break; 
     default: 
      close(pfd[WRITE_END]); 
      printf("Sohn gestartet mit PID %d\n", pid_fork); 
      midT = midB = midA = 0; 
      i = k = 0; 
      while(1){ 
       read(pfd[READ_END],&buf,sizeof(struct data)); 
       midT += buf.temp; 
       midB += buf.bst; 
       midA += buf.abst; 
       i++; 
       if(i == 10){ 
        midT /=10; 
        midB /=10; 
        midA /=10; 
        printf("Messung. %4i: Temp.: %4.1lf, Beleucht.: %4lf, Abstand: %3.1lf\n",k++, midT, midB, midA); 
        midT = midB = midA = 0; 
        i = 0; 
       } 
      } 
      while(i != -1){ 
       i = wait(&w_status); 
       if(i != -1) 
        printf("\nSohn beendet. Exit Status: %x Nummer des Sohn-Prozesses %d", 
         (w_status>>8) & 0xff, i); 
        else 
         printf("\nLetzter Sohn beendet!\n"); 
      } 
     } 
    return 0; 
} 

Das Kind Sohn Prozess sendet Messdaten alle 500 ns über eine Linux-Interrupt . Ich habe es zuerst mit einem Char-Array getestet und es war erfolgreich.

sohn.c:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <math.h> 
#include <time.h> 
#include <signal.h> 
#include <stdio.h> 
#include <sys/time.h> 
#include "funcs.h" 

#define INTERVAL 500000 

int howmany = 0; 

void alarm_wakeup (int i) 
{ 
    struct itimerval tout_val; 
    howmany += INTERVAL; 
    tout_val.it_interval.tv_sec = 0; 
    tout_val.it_interval.tv_usec = 0; 
    tout_val.it_value.tv_sec = 0; 
    tout_val.it_value.tv_usec = INTERVAL; 
    setitimer(ITIMER_REAL, &tout_val,0); 
} 

void exit_func (int i) 
{ 
    signal(SIGINT,exit_func); 
    exit(0); 
} 



int main(){ 

    struct data mess; 
    struct itimerval tout_val; 
    tout_val.it_interval.tv_sec = 0; 
    tout_val.it_interval.tv_usec = 0; 
    tout_val.it_value.tv_sec = 0; 
    tout_val.it_value.tv_usec = INTERVAL; 
    setitimer(ITIMER_REAL, &tout_val,0); 
    signal(SIGALRM,alarm_wakeup); 
    signal(SIGINT,exit_func); 

    srand(time(0)); 
    mess.nr = 0; 
    while (1) { 
     mess.nr++; 
     mess.temp = (rand()%1001)/10 - 20; 
     mess.bst = rand()%1000 + 1; 
     mess.abst = rand()%26 + 4; 
     write(STDIN_FILENO,&mess, sizeof(struct data)); 
     sleep(10); 
    } 

    exit(0); 
} 

Ausgang:

Sohn gestartet mit PID 3488 
�BhB�[email protected]��@�A�B�[email protected][email protected] A4B�C�[email protected]#D0dB�sDA  4B��CpA 
��\D�A^C 

Ausgang mit strace:

strace ./uebung2_1 
execve("./uebung2_1", ["./uebung2_1"], [/* 78 vars */]) = 0 
brk(0)         = 0x8320000 
access("/etc/ld.so.nohwcap", F_OK)  = -1 ENOENT (No such file or directory) 
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7791000 
access("/etc/ld.so.preload", R_OK)  = -1 ENOENT (No such file or directory) 
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 
fstat64(3, {st_mode=S_IFREG|0644, st_size=109872, ...}) = 0 
mmap2(NULL, 109872, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7776000 
close(3)        = 0 
access("/etc/ld.so.nohwcap", F_OK)  = -1 ENOENT (No such file or directory) 
open("/lib/i386-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\340\233\1\0004\0\0\0"..., 512) = 512 
fstat64(3, {st_mode=S_IFREG|0755, st_size=1754876, ...}) = 0 
mmap2(NULL, 1759868, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb75c8000 
mmap2(0xb7770000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1a8000) = 0xb7770000 
mmap2(0xb7773000, 10876, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7773000 
close(3)        = 0 
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb75c7000 
set_thread_area({entry_number:-1 -> 6, base_addr:0xb75c7940, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0 
mprotect(0xb7770000, 8192, PROT_READ) = 0 
mprotect(0x8049000, 4096, PROT_READ) = 0 
mprotect(0xb77b7000, 4096, PROT_READ) = 0 
munmap(0xb7776000, 109872)    = 0 
pipe([3, 4])       = 0 
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb75c79a8) = 3436 
close(4)        = 0 
fstat64(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 8), ...}) = 0 
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7790000 
write(1, "Sohn gestartet mit PID 3436\n", 28Sohn gestartet mit PID 3436 
) = 28 
read(3, �B�C�[email protected]�@ 
        B�[email protected]�nD�A�A�C�B�C`ApB�▒D��A'[email protected] ,B��C�A 
���C�A 
     �B$D�A 
PA�C�AB�LD�A<B��CA��@D [email protected]�A�[email protected]^CProcess 3435 detached 
<detached ...> 

ich den Prozess getötet mit Strg + C. Warum die Hieroglyphe?

--------------------------------------------- ------------------------------

Update: ich in der Kinder writen wurde (sohn.c) zum Standard-Eingang, aber es mus Dir zum Ausgang gewirret. Dank Joachim Pileborg

+0

Warum sind Sie * Schreiben * Standard * Eingabe *? –

+0

Außerdem sollten Sie wirklich auf Fehler von allen Systemaufrufen prüfen. –

+0

Ursache der Leitung. Mein Professor sagt mir, ich soll es so machen. – raze92

Antwort

0

ich in Kind (sohn.c) an die Standardeingabe writen wurde, aber es mus mit dem Ausgang wirte. Dank Joachim Pileborg

- Raze