【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.21782

システムコールでxclockの数と停止の間隔をオプションで指定
投稿者---ひか(2005/07/06 22:34:13)


こんにちは。
課題で行き詰ってしまいましたのでお願いします。
システムコールを使い、xclock -update 1を何個か起動し、指定された間隔で一つずつSIGTERMで停止させるというものです。オプションとして
-n n:n個起動。デフォルト値は6
-t t:t秒間隔で停止。デフォルト値は10
です。
作ったソースは以下の通りです。
以下のソースだと-nだけを指定したり、-tだけを指定したりするとセグメントエラーが出てしまいました。
ご指導お願いします。

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

#define XCLOCK_PATH     "/usr/X11R6/bin/xclock"

main(int argc, char *argv[])
{
        pid_t   pid[10000];
        int     status;
        int i, j;

        if (argc > 1 && (argv[1][1] == 'n' && argv[3][1] == 't')){
          for (i = 0; i < atoi(argv[2]); i++ ){
            switch (pid[i] = fork()) {
            case -1:
              perror(argv[0]);
              return 1;
            case 0:
              execl(XCLOCK_PATH, "xclock", "-update", "1", NULL);
              _exit(1);
            }
          }
          for (j = 0; j < atoi(argv[2]); j++){
            sleep(atoi(argv[4]));
            kill(pid[j], SIGTERM);
            waitpid(pid[j], &status, 0);
            printf("Done.\n");
          }
          return 0;
        }

        if (argc == 1){
          for (i = 0; i < 6; i++){
            switch(pid[i] = fork()){
            case -1:
              perror(argv[0]);
              return 1;
            case 0:
              execl(XCLOCK_PATH, "xclock", "-update", "1", NULL);
              _exit(1);
            }
          }
          for (j = 0; j < 16; j++){
            sleep(10);
            kill(pid[j], SIGTERM);
            waitpid(pid[j], &status, 0);
            printf ("Done.\n");
          }
          return 0;
        }

        if (argc > 1 && argv[1][1] == 'n'){
          for (i = 0; i < atoi(argv[2]); i++){
            switch(pid[i] = fork()){
            case -1:
              perror(argv[0]);
              return 1;
            case 0:
              execl(XCLOCK_PATH, "xclock", "-update", "1", NULL);
              _exit(1);
            }
          }
          for (j = 0; j < atoi(argv[2]); j++){
            sleep(10);
            kill(pid[j], SIGTERM);
            waitpid(pid[j], &status, 0);
            printf ("Done.\n");
          }
          return 0;
        }

        if (argc > 1 && argv[1][1] == 't'){
          for (i = 0; i < 6; i++){
            switch(pid[i] = fork()){
            case -1:
              perror(argv[0]);
              return 1;
            case 0:
              execl(XCLOCK_PATH, "xclock", "-update", "1", NULL);
              _exit(1);
            }
          }
          for (j = 0; j < 6; j++){
            sleep(atoi(argv[4]));
            kill(pid[j], SIGTERM);
            waitpid(pid[j], &status, 0);
            printf ("Done.\n");
          }
          return 0;
        }
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:システムコールでxclockの数と停止の間隔をオプションで指定 21784 かずま 2005/07/06 23:36:38


No.21784

Re:システムコールでxclockの数と停止の間隔をオプションで指定
投稿者---かずま(2005/07/06 23:36:38)


>        if (argc > 1 && (argv[1][1] == 'n' && argv[3][1] == 't')){

argc が 3 のとき、argc[3] や argv[4] を参照しているから駄目なんです。

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

#define XCLOCK_PATH     "/usr/X11R6/bin/xclock"

int main(int argc, char *argv[])
{
    pid_t pid[1000]; int status, i, n = 6, t = 10;

    for (i = 1; i < argc; i++)
        if (!strcmp(argv[i], "-t"))
            if (++i < argc) t = atoi(argv[i]);
            else puts("bad option"), exit(1);
        else if (!strcmp(argv[i], "-n"))
            if (++i < argc) n = atoi(argv[i]);
            else puts("bad option"), exit(1);
        else  puts("bad option"), exit(1);

    for (i = 0; i < n; i++) {
        switch (pid[i] = fork()) {
        case -1:
            perror(argv[0]);
            return 1;
        case 0:
            execl(XCLOCK_PATH, "xclock", "-update", "1", NULL);
            _exit(1);
        }
    }
    for (i = 0; i < n; i++) {
        sleep(t);
        kill(pid[i], SIGTERM);
        waitpid(pid[i], &status, 0);
        printf("Done.\n");
    }
    return 0;
}



この投稿にコメントする

削除パスワード

No.21791

Re:システムコールでxclockの数と停止の間隔をオプションで指定
投稿者---ひか(2005/07/07 11:42:27)


かずまさん、ありがとうございました!
無事解決しました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧