質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Debian

Debianは、Debian GNU/Linux などのOS(オペレーティングシステム)です。

Q&A

解決済

2回答

6341閲覧

Linux Cにおけるforkエラーについて

cafe_takai

総合スコア27

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Debian

Debianは、Debian GNU/Linux などのOS(オペレーティングシステム)です。

0グッド

1クリップ

投稿2016/09/05 01:53

編集2016/09/05 01:55

Debian上でgccコンパイラにおいてプログラムを作成している初心者です。

メインプログラム(eco_deg)から一定間隔で他のプログラム(eco_c)を起動、パラメータを渡します。起動した外部プログラムは一定の処理を行った後に終了し、制御がメインプログラムに戻ってきます。

その、他のプログラムを起動させるとき、fork関数を用いているのですが、プログラムを1ヶ月程度動かしているとforkのところでエラーが出て、プログラムが停止してしまいます(エラーを起こす規則性は捉えることができていません)。

お聞きしたいのは次の二点です。

1 fork関数がエラーを返す要因としては何が考えられるのでしょうか。
2 fork関数でエラーを得た場合、自分自身を再起動するような下に記載する書き方は有効なのでしょうか。

1につきましては、自身のプログラムに起因しているといわれると返す言葉がないのですが、参考になるような情報をいただけましたらありがたく存じます(現在は下のプログラムにおいて、pid < 0の部分は、はエラーログ出力のみの記載になっています)。

2につきまして、本プログラムはデーモンで常時動いており、エラーがあった場合は自分自身を再起動したらどうかと考えています。ただ、その場合、forkで失敗したのに下のような記載方法で良いのか分かりません。またfork関数で失敗するのがプログラム稼動後、約1ヵ月後のため、未だ実際の確認ができないでおります。

C

1pid_t pid; 2pid = fork(); 3if (pid < 0){ 4 //forkに失敗したら自身を再起動... 5 execl("./eco_deg", NULL); 6} 7else if (pid == 0){ 8 //外部プログラムを起動... 9 execlp("./eco_c", param1, param2); 10 exit(-1); 11} 12

拙い記載で、内容が伝わるのか甚だ不安ではおりますが、どなた様かご教授賜れましたら幸いです。

宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

man forkに、想定されるエラー原因が書いてあります。errnoを参照するとどのエラーかわかります。
普通は(標準エラー出力が取れるのなら)、システムコールに失敗したらperror関数を呼びます。man 3 perror参照。

投稿2016/09/05 02:19

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cafe_takai

2016/09/05 08:34

otn様 早速のご返答ありがとうございます。 ソフトとしてはデーモンとして動いており、ユーザが意識しないようにしているため、errnoをログ出力するように変更してみます。 ありがとうございます。
guest

0

otnさんの言われているようにerrnoを見ましょう。
現象がすぐ再現できるならstraceを使ったり、
エラールートでabort()させてコアダンプさせ、それをgdbで解析するという方法もあります。(あくまでプログラムの問題しかわかりませんが・・・)

投稿2016/09/05 05:06

nullbot

総合スコア910

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cafe_takai

2016/09/05 08:34

terakura様 早速のご返答ありがとうございます。 ソフトとしてはデーモンとして動いているため、errnoをログ出力するように変更してみます。なお発症が月1回程度で、再現が直ちに難しい状況です。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問