- PR -

C言語で2つのプログラムを交互に動かす

投稿者投稿内容
yshita
常連さん
会議室デビュー日: 2004/07/05
投稿数: 34
投稿日時: 2004-12-29 17:04
C言語(Linuxを使用)で2つのプログラムを交互に動作させたいと考えています。
例えば、test1.cとtest2.cというプログラムがあったときに

1.test1.cを1秒間実行させる。
2.test1.cの動作を止める。
3.test2.cを1秒間実行させる。
4.test2.cの動作を止める。
5.1.test1.cを1秒間実行させる。

このように交互にプログラムを動作させることって可能なのでしょうか?
(例えばシェルスクリプトで書いたりできるのでしょうか?)
よろしくお願いします。

[ メッセージ編集済み 編集者: yshita 編集日時 2004-12-29 17:29 ]
pr0
会議室デビュー日: 2004/12/25
投稿数: 17
投稿日時: 2004-12-29 17:29
シェルスクリプトか何かで,プロセスの起動停止を
繰り返せばできると思います.

だだ,プロセスが起動して実際の処理を開始するまでの時間と
実際の処理が停止してプロセスが落ちるまでの時間を
考慮すると厳密に1秒というのはどうなんでしょう?
ほろりん
ベテラン
会議室デビュー日: 2004/11/24
投稿数: 98
お住まい・勤務地: あそこ
投稿日時: 2004-12-29 19:21
test1.cとtest2.cで何をやりたいんでしょか?

正確に1秒ごとに実行させたいのならcrontabの使用とか。
おおよそでよければ時刻を監視して秒が変わったら落ちるプログラムをshでまわすとか、
あるいは秒が変わったらもうひとつのプログラムをforkして落ちることを交互に繰り返すとか。
#time()だと1秒しか分解能がないよね。うーん。

あと、会議室違いのような気するんだが。master of IPじゃなくてLinux Squareじゃないかと。


[ メッセージ編集済み 編集者: ほろりん 編集日時 2004-12-29 19:23 ]
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2004-12-29 22:05
どのくらいのことが要求されているのか分かりませんが...

・0時0分0秒〜0時0分1秒までtest1が動作
・0時0分1秒〜0時0分2秒までtest2が動作
・0時0分2秒〜0時0分3秒までtest1が動作
...
というのが正確に要求されているのだとすると、Linux のプロセス管理の
仕組み上、不可能です。

おおざっぱでも良いのなら...
・test1 が起床したときに alarm() をセットして1秒後に SIGALRM が
 飛ぶようにする
・SIGALRM を受けると test2 に向けてシグナルを飛ばし、自身は
 test2 からのシグナルを待つように仕込んでおいてからスリープする
・test2 もこれと同様にする
というような仕掛けでなんとかなるかと思います。

追記。
上では結構さらっと書いてしまいましたが、このやり方はわりとややこしい
問題を含んでいます。

走行時間についての精度がそれほど要求されない場合は、時間を管理する
プロセスを別に設けたほうが楽に書けると思います。
・管理用の親プロセスが子プロセスをふたつforkして、一方をtest1、
 他方をtest2にする
・親プロセスは1秒ずつsleepするループに入る。そこで子プロセスの
 一方にSIGSTOPを送り、他方にSIGCONTを送る
という感じで。

[ メッセージ編集済み 編集者: ぽんす 編集日時 2004-12-30 11:01 ]
ほろりん
ベテラン
会議室デビュー日: 2004/11/24
投稿数: 98
お住まい・勤務地: あそこ
投稿日時: 2004-12-31 12:33
sleep()の精度は1秒未満ではすごく大雑把だったと記憶してます。
usleep()のほうがまだよいかと。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/usleep.3.html

ぽんすさんの指摘もありますが、おおざっぱに次の2の方法があります。
a.正確に1秒ごとにしたい
b.おおよそ1秒でいい
前者であれば、正確に1秒おきに何かしらalarmを通知する時計が必要だし、後者であれば、usleep()の制御で十分。
ただし、nice値で優先順位を上げないと負荷の高いとき、数秒間制御がわたってこない可能性もあります。

おまけ
"Linux 時計 精度"で検索するとおもしろい議論がたくさんみつけることができます。

http://www.linux.or.jp/JF/JFdocs/IO-Port-Programming/high-resolution.html
http://www.emit.jp/prog/prog_t1.html

[ メッセージ編集済み 編集者: ほろりん 編集日時 2004-12-31 12:42 ]
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-12-31 23:31
yshitaさん、こんにちは。

test1, test2が各々独立した『プロセス』として実行されるなら、
1秒ごとに切りかえるのは不自然に思えます。そのような用途は
思いつきません。

でも同一プロセス上の2つの『スレッド』として実行されるの
なら、もしかしてあるのかなと思います。

POSIXのpThreadはご存知とは思いますが、Linuxのほか、他の商用
Unixでも使用できますので検討してみては如何でしょうか?
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2005-01-01 01:12
$ chmod 755 twin.sh
コード:
#!/bin/sh


flg='0'

while :
do
if [ $flg = '0' ]; then
./aho
flg='1'
else
./boke
flg='0'
fi

# sleep 1
done



$ gcc -o aho -O aho.c
コード:
#include <stdio.h>

#include <signal.h>
#include <unistd.h>

static void handler();

int main()
{
alarm(1);
(void) signal(SIGALRM, handler);

while(1){
printf("アホ\n");
}
}

static void handler()
{
exit(0);
}



$ gcc -o boke -O boke.c
コード:
#include <stdio.h>

#include <signal.h>
#include <unistd.h>

static void handler();

int main()
{
alarm(1);
(void) signal(SIGALRM, handler);

while(1){
printf("ボケ\n");
}
}

static void handler()
{
exit(0);
}



[ メッセージ編集済み 編集者: コブラ 編集日時 2005-01-01 07:47 ]
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2005-01-01 04:40
コブラさん、こんにちは。

でも、そのやり方では1秒間停止してしまって、
1秒間実行した事にならないと思うんですよ。

スキルアップ/キャリアアップ(JOB@IT)