הקוד
error_exit מדפיסה הודעת שגיאה עם perror ויוצאת עם exit. אז ב"עפה" התכוונתי להודעה שאני מקבל. אם אני מתעלם מ-ECHILD התוכנית מתפקדת ללא בעיות. לגבי gdb אני אצטרך לקרוא קצת על עבודה עם מספר תהליכים, אז זה יאלץ להדחות למחר ועכשיו לקוד: כל מה שעושים התהליכים הבנים הוא לפתוח fifo (קיים) לכתיבה, לבצע redirection ל-stdout ו-stderr ל-fifo הזה ולבצע execvp. אני מקבל את התוצאות הנ"ל גם כשאני בטוח שאין לי threads בתהליכים הבנים (למשל אם אני עושה exec ל-cp בלי פרמטרים). תהליך האב מבצע את הקוד הבא (הורדתי חלקים לא חשובים) בלולאת while אינסופית:
// wait until a message arrives do ret_value = select(fifo_fd+1, &fifo_fd_set, NULL, NULL, tvptr); while ( ret_value < 0 && errno == EINTR ); if ( ret_value < 0 ) error_exit("select error", ERROR_CODE); // if a message arrived, handle it and continue if ( ret_value > 0 ) { handle_message(fifo_fd); continue; } /* else - its time to execute a program */ // catch SIGCHLD if ( signal(SIGCHLD, sigchld_handler) == SIG_ERR ) error_exit("Signal error",ERROR_CODE); // fork off a child pid = fork(); if ( pid < 0 ) // fork error error_exit("Fork error",ERROR_CODE); else if ( pid == 0 ) { // child process signal(SIGCHLD, SIG_DFL); // See remarks below exec_next(); // execute } // parent process FD_ZERO(&fifo_fd_set); FD_SET(fifo_fd, &fifo_fd_set); // do some stuff, and start the while loop again
לגבי ההערה על signal בתהליך הבן (הקריאה השנייה ל-signal) - התוכנית מתנהגת באותה צורה עם השורה הזאת ובלעדיה. הסיבה לקיום שלה היא שאני לא יודע אם התהליכים הבנים מבצעים fork. יכול להיות שהיא מיותרת כי אני מבצע exec ? תודה מראש