C語言 System Calls 的問題

有一個英文C語言的題目

一共有四段 大家可以幫我看看這題目在問甚麼??

Write a program that spawns and controls multiple processes. The program should use system calls such as fork(), wait(), execvp() to manage the processes. The program should use signal system calls to communicate between the processes. The processes should coordinate a simple command structure where the main process is "base" and the child processes are "planes".

要使用 fork(), wait(), execvp() 方式寫一個程式, main 裡面必須包含 base 另外child 裡面應該包含 plane

The base process is the main process. It should run in a simple loop, prompting the user for an input command. Valid input commands include "launch", "bomb N", "status", "refuel N", and "quit". Invalid commands should produce a suitable error message. Upon receiving the command to quit, the program should end.

main 裡面設計一個迴圈讓使用者可以下指令. 包含"launch"(應該是起飛), "bomb N"(N台轟炸機), "status"(狀態), "refuel N"(加油), and "quit"(離開), 下不對的指令會出現錯誤的訊息, 等到收到 "quit" 就代表程式終了

Update:

The launch command should cause a child process to start. All child processes should execute the same code. A child process should execute a simple loop, counting "fuel" downward from 100 at a rate of 5 fuel/second.

Update 2:

Every 3 seconds it should report its fuel status by printing out the line "Bomber N to base, # fuel left," where N is the child's process ID. Upon receiving the signal SIGUSR1,

Update 3:

, the child process should print out the line "Bomber N to base, bombs away!" where N is the child's process ID. Upon receiving the signal SIGUSR2, the child process should "refuel," resetting its fuel value to 100.

Update 4:

Upon reaching zero fuel, the child process should send the signal SIGUSR2 to the main process, and then exit.

Update 5:

重點是上面補充這裡 看不太懂甚麼意思

Update 6:

The main process must maintain a list of process IDs of the child processes. Given the bomb N command, the main process should send the signal SIGUSR2 to child process ID=N.

Update 7:

Given the refuel N command, the main process should send the signal SIGUSR2 to child process ID=N. Given the status command, the main process should list the child processes IDs.

Update 8:

Upon receiving the SIGUSR2 signal, the main process should print out "SOS! Plane has crashed!" The main process will not know which child process sent the signal, so if this happens the status list will thereafter be in error.

Update 9:

題目有點長主要重點應該是集中在後半段,昨天看了半個小時左右,還是搞不太清楚題目是要我怎麼做出這個遊戲

Update 10:

prisoner 說實在我根本不了解甚麼是signals

不過我會花一整個禮拜的時間練習systems calls這個部分

因為老師有出這個題目

所以想說先知道題目怎麼問

我可邊讀邊想要怎麼完成這個程式

Update 11:

這樣看起來應該是要用 fork()的child 功能,生出很多子轟炸機,然後再用sleep()

我在想想 Thanks,

Update 12:

我錯了

The main process must maintain a list of process IDs of the child processes. Given the bomb N command, the main process should send the signal "SIGUSR1 " (不是 SIGUSR2) to child process ID=N.

Update 13:

題目太長眼睛花了

Update 14:

謝謝二等酸民

到剛剛為止還只看到fork() exec() wait()還有signal

我再研究看看thread

可能在更後面的章節

Thanks

Update 15:

to prisoner 大大

我沒有逃走

只是一直在k前面還有這個章節

因為只有讀懂一點才能再跟你們對話 ~~~

否則雞同鴨講

請給我一個禮拜左右時間

Update 16:

說錯了一個晚上時間

手抖打錯了

Update 17:

#include

#include

main()

{

int i,j;

j=0;

i=fork();

if(i==0)

{

printf("女兒執行這個程式");

for(i=0;i<5;i++)

printf("女兒%d",i);

}

else{

printf("媽媽執行這個程式");

}

}

Update 18:

這個程式執行出來

會有:

女兒 0

女兒 1

女兒 2

女兒 3

女兒 4

媽媽執行這個程式

to prisoner 這是互認的意思嗎??

Update 19:

請問 prisoner

妳的程式真的很棒

可是有一點我看懂的是

裡面有提到SIGUSR1 以及 SIGUSR2

我有點不了解

我兩天翻課本 有看到例題用 kill -USR1 +數字 (數字是由檔案名稱 & 來的)

可是很像不能套在妳提供的程式內

當執行你的程式每3秒會回報 fuel 下降15單位

我看到程式裡面有 case SIGUSR2 可以 max fuel 就很想執行看看

5 Answers

Rating
  • 7 years ago
    Favorite Answer

    我想妳就算英語看懂了 妳也不會做的。

    妳對interprocess communication and signals夠聊解嗎?

    2013-11-24 23:07:51 補充:

    我也沒有學過這東東 只有以前在party時聽過男生們在臭屁過

    應該很簡單吧 連那群笨豬腦高中生都會的東東

    2013-11-25 00:21:14 補充:

    簡單簡單。只是放不下 就先給你小baby的程式吧。

    2013-11-25 00:23:06 補充:

    #include <stdio.h>

    #include <stdlib.h>

    #include <unistd.h>

    #include <errno.h>

    #include <signal.h>

    #include <sys/wait.h>

    #define FUEL_MAX (100)

    typedef enum {

    GROUND,

    OUT,

    BOMB_AWAY,

    IN,

    MAX

    } STATE;

    char *state_text[] = {

    "gound",

    "out",

    "bomb away",

    "in",

    ""

    };

    STATE State;

    char *id;

    int fuel;

    static void mySigHand(

    int sig

    ){

    switch(sig){

    case SIGUSR1:

    State = BOMB_AWAY;

    printf("Bomber %s to base, bombs away... coming home!\n", id);

    return;

    case SIGUSR2:

    fuel = FUEL_MAX;

    printf("Bomber %s to base, max fuel=%d\n", id, fuel);

    return;

    default:

    printf("Bomber %s to base, unknown command\n", id);

    return;

    }

    }

    int main(

    int argc,

    char **argv

    ){

    unsigned int tim;

    int parent;

    if (3 < argc) {

    printf("Bomber ?? to base, ID unknown... Exiting...\n");

    return 100;

    }

    id = argv[1];

    parent = atoi(argv[2]);

    if (SIG_ERR == signal(SIGUSR1, mySigHand)) {

    printf("Bomber %s to base, cannot turn on USR1 channel Exiting...\n", id);

    return 11;

    }

    if (SIG_ERR == signal(SIGUSR2, mySigHand)) {

    printf("Bomber %s to base, cannot turn on USR2 channel Exiting...\n", id);

    return 12;

    }

    printf("Status: Bomber %s to base, taking off...\n", id);

    for(fuel=FUEL_MAX, State=OUT, tim=0;

    0 < fuel && (OUT == State || BOMB_AWAY == State);

    ++tim, fuel-=5, sleep(1)){

    if (!(tim%3)) printf("Status: Bomber %s to base, Status=%s, Fuel=%d...\n",

    id,state_text[State],fuel);

    }

    printf("Status: Bomber %s to base, Status=%s, Fuel=%d...\n", id,state_text[State],fuel);

    kill(parent, SIGUSR2);

    return (BOMB_AWAY != State);

    }

    2013-11-26 06:55:02 補充:

    美美姐姐好像逃走了耶?!?

    2013-11-27 04:39:24 補充:

    這樣子吧:我出一個基本的問題讓妳去找答案好嗎?

    媽媽與女兒(群)之間要怎互任?

    2013-11-28 21:56:13 補充:

    > 這樣子利用PID的方式來相認 這樣對嗎??

    不是不是. 當媽媽把女兒分出來的時候他們自己 誰是誰自己都分不清

    唯一可以區分的是

    醫生會告訴媽媽 她女兒的名字

    醫生會告訴女兒 0(因該是女兒還小聽了也會忘記吧)

    所以媽媽要找女兒就用 她的名字找就可以吧!

    但是女兒找媽媽 就有點難了

    2013-11-28 22:06:39 補充:

    i=getpid();// 這是自己的名字

    printf("媽媽=%d\\n",i);

    fork(); // 妳對fork()還是不知道 再讀一下吧!!! 她就是醫生耶!

    i=getpid(); // 這也是自己的名字

    printf("女兒=%d",i);// 不行不行 連媽媽自己也會印出"女兒=媽媽"

    2013-11-28 22:11:01 補充:

    signal() and kill() 是細節 妳先不要計較 先把媽女相認的故事編完才型的吧!

    2013-11-28 22:16:03 補充:

    其實我的女程式就有不完整的寫出 女兒認識媽媽的過程

    see the "parent" variable.

    這應該不難吧 我孤狗半個小時而已耶!

    2013-11-30 11:57:31 補充:

    018是對的 但是我不認為妳對communicating sequential process有足夠的聊解

    拜託其他中語比較好的大大解釋給他聽聽吧.

    2013-12-01 04:57:50 補充:

    也請看我對fork()流程的分析

    http://tw.knowledge.yahoo.com/question/question?qi...

    2013-12-05 01:31:08 補充:

    有切水果盤嗎? bring some beers too, would you?

    2013-12-06 02:49:17 補充:

    這次美美姐姐真的是逃走了 連水果都沒吃就走了 女母相認不了了

    2013-12-06 08:24:51 補充:

    為了支持女生萬歲. 我再試一下吧:

    妳可以描述一下

    fork()

    是在做神東東啊?

    http://linux.die.net/man/3/fork

    2013-12-06 09:32:58 補充:

    1. 妳說的"shall" 應該是 "shell"?

    2. fork()是system call應該與shell無關吧

    3. 除此之外妳說的是正確的

    4.那妳知道媽媽要怎找女兒了 ( 會把女兒的process ID 送還給媽媽)

    5.那女兒怎知道媽媽的名字呢?

  • 7 years ago

    i=fork(); //醫生要分出母女

    if(i==0) // 女兒

    printf();

    else //>0 就是母親

    prinf();

    可以用 0 與 >0做區別 女兒跟母親嗎??

    2013-12-06 04:07:12 補充:

    真的跑走了 ~~ 想不出來 >

    2013-12-06 08:58:55 補充:

    我可以這樣解釋嗎??

    呼叫fork()可以create 一個新的 process (一個媽媽 一個女兒), 這是直接copy calling process. 女兒的 ID和媽媽的不同 (以此來區別) , 而當整個執行完成後shall 會送給女兒一個 "0 ,shall 會把女兒的process ID 送還給媽媽 ^^

    2013-12-07 05:49:49 補充:

    因為快到期了

    我先選出最佳答案 ^^

  • 7 years ago

    補充裡其中一段:

    "The main process must maintain a list of process IDs of the child processes. Given the bomb N command, the main process should send the signal SIGUSR2 to child process ID=N."

    你確定題目是寫SIGUSR2, 而不是SIGUSR1 ??

    2013-11-24 13:29:57 補充:

    我沒寫過C語言所以不知道fork(), wait(), execvp(),

    也沒用過signal.h, SIGUSR1, SIGUSR2, 完全不知道是啥.

    不過若以我寫C++程式的方式, 或許會跟大大要寫的很像,

    希望對大大有幫助.

    題目主要就是一個系統裡有1個main process管理N個child process,

    軟體的用戶只能藉由main提供的介面來監控與控制這整個系統.

    2013-11-24 13:37:08 補充:

    主要架構:

    main process除了main thread負責接收軟體用戶的command,

    還需要另一個thread負責接收child process傳過來的訊息.

    而child process裡可能只需要main thread,

    負責倒數fuel與看是否有接收來自main process傳過來的訊息,

    若倒數完就主動傳訊息給main process並結束程式.

    2013-11-24 13:42:28 補充:

    若以這個架構來做的話, 你需要學會的步驟:

    1. 先管理一個child就好了.

    2. 如何開啟一個child程式.

    3. 如何用interprocess communication傳訊息給child,

    child如何接收到訊息.

    4. 如何在main process開另一個thread當負責接收child傳來的訊息.

    5. 可以完美管理好一個child process, 再改成管理多個.

  • Tai
    Lv 5
    7 years ago

    所有飛機都用同 code (這 ok, 只要備有不同資料就好)

    1. 都要倒數油量. 滿油 100, 之後每秒遞減 5 fuel

    2. 每三秒, 轟炸機回報剩油量.

    3. 飛機收到 SIGUSR1 後, bombs away? 扔炸彈嗎?

    4. 收到 SIGUSR2, 則可充油到滿 100

    5. 若不幸沒油, 送 SIGUSR2 到塔台, exit ( 該機應該就墜落了, 之後塔台要求他回報, 有 error)

    2013-11-24 08:17:47 補充:

    塔台需要維護 child list process IDS

    1. "Bomb N": 塔台該以 SIGUSR2 通知轟炸機 N

    2. "Refuel N": 塔台以 SIGUSR2 通知轟炸機 N 加油

    3. "Status": 塔台要列出還在的 child process IDs

    4. 收到轟炸機的 SIGUSR2 (沒油了), 塔台要印出 "SOS .." ..

    不過 main process 並不知道哪架飛機送的 (??), 所以之後的 status list, 沒有回應的飛機就是墜機 (error)

    2013-11-24 08:20:56 補充:

    正巧 multi-thread, signal 什麼的逃課了

    P大就順便幫一下忙嘛

    2013-11-26 12:14:34 補充:

    版大只是去念書吧 ...

    2013-12-03 18:09:14 補充:

    恩,沙發搬來了 ____

  • How do you think about the answers? You can sign in to vote the answer.
  • Anonymous
    7 years ago

    還是要去 http://aaashops.com/ 品質不錯,老婆很喜歡。

    俷咱咱俷呕凲偓劶

Still have questions? Get your answers by asking now.