Προς το περιεχόμενο

system calls σε C


mariakal

Προτεινόμενες αναρτήσεις

Δημοσ.

Προσπαθώ να κάνω ένα πρόγραμμα σε C, το οποίο θα κάνει χρήση των πιο κάτω κλήσεων συστήματος του Linux:

• Μια διεργασία Πατέρας θα παράγει 10 τυχαίους ακεραίους (rand).

• Στη συνέχεια θα παράγει (fork) 2 διεργασίες.

• Οι διεργασίες Παιδιά θα τυπώνουν το PID τους και θα κάνουν ταξινόμηση (qsort, βλ. <stdlib.h>) τους ακεραίους κατά αύξουσα σειρά η μία, και κατά φθίνουσα σειρά η άλλη.

• Οι ταξινομημένοι πίνακες θα τυπώνονται στο stdout με χρήση της write (η sprintf επιτρέπεται να χρησιμοποιηθεί, η printf/fprintf δεν επιτρέπεται).

• Η διεργασία Πατέρας θα βρίσκεται σε αναμονή (wait) μέχρι να ολοκληρώσουν οι διεργασίες Παιδιά την εκτέλεση τους.

 

Το παλεύω αρκετά, αλλά δεν βλέπω....φως!!

Μήπως μπορεί κάποιος να με βοηθήσει?

Δημοσ.

Νομίζω πως μόνο το τελευταιο ερώτημα μπορώ να κάνω:

 

...

int childExitStatus;

pid_t ws = waitpid( pID, &childExitStatus, 0);

if( !WIFEXITED(childExitStatus) )

{

cerr << "waitpid() exited with an error: Status= "

<< WEXITSTATUS(childExitStatus)

<< endl;

}

else if( WIFSIGNALED(childExitStatus) )

{

cerr << "waitpid() exited due to a signal: "

<< WTERMSIG(childExitStatus)

<< endl;

}

Δημοσ.

Το παρακάτω προγραμματάκι σε βοηθάει να λύσεις τα εξής ερωτήματα:

• Στη συνέχεια θα παράγει (fork) 2 διεργασίες.

• Οι διεργασίες Παιδιά θα τυπώνουν το PID τους

• Η διεργασία Πατέρας θα βρίσκεται σε αναμονή (wait) μέχρι να ολοκληρώσουν οι διεργασίες Παιδιά την εκτέλεση τους.

 

>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>

int main ()
{
 pid_t child1_pid, child2_pid, ch_pid;
 int status;

 signal(SIGCHLD, SIG_IGN);

 /* spawn first child */
 if ((child1_pid = fork()) == 0)
 { /* first child process */
   fprintf(stdout, "hello from child %d\n", getpid());
   sleep(10);
 }
 else { /* parent process */
   /* spawn second child */
   if ((child2_pid = fork()) == 0)
   { /* second child process */
     fprintf(stdout, "hello from child %d\n", getpid());
     sleep(10);
   }
   else { /* parent process (again) */
     /* wait for all childs to terminate */
     fprintf(stdout, "parent %d is waiting for all childs to terminate\n", getpid());
     ch_pid = wait(&status);
   }
 }
 return (0);
}

 

Τα υπόλοιπα ερωτήματα δεν έχουν να κάνουν με C system calls και είναι πιο απλά.

 

Υ.Γ. Ο κώδικας που έχεις δώσει δεν έιναι σε C αλλα σε C++ νομίζω!

Δημοσ.

Ευτυχώς για την ανθρωπότητα που ο poscaman γεννήθηκε ξερόλας!!

Τόσο τρομερό είναι για τη φίλη mariakal, να ζητά βοήθεια (ενδεχομένω) απο το internet?

Άλωστε όποιος δεν θέλει να τη βόηθήσει ας μην απαντήσει.

Τα καόβουλα σχόλια δεν νομίζω ότι ωφελούν σε κάτι.

Δημοσ.

Αγαπητέ μου, δεν γεννήθηκα ξερόλας. Έχω ρωτήσει άπειρες φορές, από τα πιο χαζά θέματα στο φόρουμ. Το ζήτημα όμως είναι ότι και εσύ αλλά και ο topic starter, πάτε να τελειώσετε μια σχολή με τις πλάτες του insomnia. Θέλεις να σου κάνω quote μήνυμα που σε γειώνει moderator του forum???????

Δημοσ.

Καταρχίν, είμαι γένους θηλυκου......

Κατά δεύτερον, ίσως να τα βλέπουμε τα πράγματα από διαφορετική οπτική γωνία, οπότε μπορεί να έχεις κ δίκιο!!

Τρίτον, έτσι δε βοηθάμε την mariakal ....

και Τέταρτον έχεις ωραία ιστοσελίδα!!

:-)

Δημοσ.
Καταρχίν, είμαι γένους θηλυκου......

Κατά δεύτερον, ίσως να τα βλέπουμε τα πράγματα από διαφορετική οπτική γωνία, οπότε μπορεί να έχεις κ δίκιο!!

Τρίτον, έτσι δε βοηθάμε την mariakal ....

και Τέταρτον έχεις ωραία ιστοσελίδα!!

:-)

 

  1. Ουπς. Sorry :-)
  2. Το μέλλον θα δείξει
  3. Η mariakal έχει ήδη βοηθηθεί, και δεν απανήλθε με απορίες που θα μπορούσε κάποιος να την βοηθήσει.
  4. Να σαι καλά. Ευχαριστώ.
  5. Μη μου πεις οτι είσαι και CEIDού... θα πηδηχτώ απ' το παράθυρο...

αυτα....

 

τέλος το offtopic, απο μένα, πάω να την πέσω στην voulaji μέσω ΡΜ :mrgreen:

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...