- Community Home
- >
- HPE Community, Japan
- >
- HP-UX
- >
- HP-UX General
- >
- msgrcvについて
カテゴリ
Company
Local Language
フォーラム
ディスカッションボード
フォーラム
- Data Protection and Retention
- Entry Storage Systems
- Legacy
- Midrange and Enterprise Storage
- Storage Networking
- HPE Nimble Storage
ディスカッションボード
ディスカッションボード
ディスカッションボード
ディスカッションボード
フォーラム
ディスカッションボード
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
- BladeSystem Infrastructure and Application Solutions
- Appliance Servers
- Alpha Servers
- BackOffice Products
- Internet Products
- HPE 9000 and HPE e3000 Servers
- Networking
- Netservers
- Secure OS Software for Linux
- Server Management (Insight Manager 7)
- Windows Server 2003
- Operating System - Tru64 Unix
- ProLiant Deployment and Provisioning
- Linux-Based Community / Regional
- Microsoft System Center Integration
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
フォーラム
ブログ
- RSS フィードを購読する
- トピックを新着としてマーク
- トピックを既読としてマーク
- このトピックを現在のユーザーにフロートします
- ブックマーク
- 購読
- 印刷用ページ
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
09-06-2004 06:48 PM
09-06-2004 06:48 PM
msgrcvについて
メッセージは受信していないので、処理は異常ではなく、正常の動作ともいえるのですが、これは仕様でしょうか?メッセージ無しに該当するerrno(35)が返却されるのが正解ではないのでしょうか?
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
09-07-2004 06:24 AM
09-07-2004 06:24 AM
msgrcvについて
> 戻り値に-1(異常)が返却されましたが、
> errnoが更新されず0のままでした。
HP-UXのrevisionや、具体的なコードがないのでなんともいえませんが、HP-UX 11.11 で以下のようなコードをコンパイル、実行すると、
#include
#include
struct mymsg {
long mtype; /* message type */
char mtext;
};
main()
{
int msg, ret, err;
struct mymsg msgbuf;
extern int errno;
msg = msgget(IPC_PRIVATE, 0666|IPC_CREAT);
if (msg == -1) {
perror("msgget");
exit(1);
}
printf("msg : %d\n", msg);
ret = msgrcv(msg,
(void *)&msgbuf,
1000,
0,
IPC_NOWAIT);
err = errno;
if (ret == -1) {
perror("msgrcv");
printf("errno : %d\n", err);
}
printf("ret = %d\n", ret);
msgctl(msg, IPC_RMID, (struct msqid_ds *)NULL);
}
$ cc msg.c
$ ./a.out
msg : 252
msgrcv: No message of desired type
errno : 35
ret = -1
message queue の id 252,
msgrcv の戻り値(ret)は -1 で、 errnoは
35。これは/usr/include/sys/errno.h では、
#define ENOMSG 35 /* No message of desired type */
ですので、戻り値も errno も適切に設定されているようです。
( ess2さんの場合、戻り値は -1 で、errno のみ0
ということですが、失礼ながらもしかしたら、
ret = msgrcv(...);
if (ret == -1) {
printf("msgrcv failed with ret = %d\", ret);
printf("errno = %d\n", errno);
...
みたいなコードにしていませんか? errno が
msgrcv()の終わりで設定されても、それを保存していないと次のsystem call呼び出し(この例では printf()からwrite()が呼ばれる)により値が変わります。)
参考まで。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
09-07-2004 09:38 PM
09-07-2004 09:38 PM
msgrcvについて
投稿していただいたサンプルプログラムを
こちらの環境(HPUX 11.11)で確認してみたところでは、正しく動作いたしました。
msgrcvの直後でperrorでエラーメッセージを表示させると確かにNo message of desired typeが表示されるのですが、errnoはやはり0が返されます。こんなことってあるのでしょうか?
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
09-08-2004 06:15 AM
09-08-2004 06:15 AM
msgrcvについて
> させると確かにNo message of desired typeが
> 表示されるのですが、errnoはやはり0が
> 返されます。こんなことってあるのでしょうか?
もしプログラムが、
ret = msgrcv(...);
perror("msgrcv");
printf("%d\n", errno);
とかになっているのなら、perror()関数中で、
errnoをキーにして"No message of desired type"という文字列を見つけた後、write()システムコールで標準エラー出力に書きます。この標準エラー出力へのwriteが成功すれば、errno は 0 にセットされますので、その後の printf("%d\n", errno) では 0 が表示されます。
ですので、msgrcv()が設定したerrnoの値を確認するには、msgrcv()から戻ってから、別なシステムコールを呼び出す前に、どこかにコピーしておかないとうまくいきません。ですので、サンプルでは、
ret = msgrcv(...);
err = errno;
にしてerrを表示するようにしてあります。これなら、他のシステムコールが呼ばれる余地はないはずですから。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
09-08-2004 03:31 PM
09-08-2004 03:31 PM
msgrcvについて
マルチスレッドのアプリケーションの場合、
コンパイルオプションで-DREENTRANTを指定してコンパイルするとスレッド単位にerrnoが管理できるようになるとのことです。
nadachiさん、ご協力ありがとうございました。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
09-09-2004 09:45 AM
09-09-2004 09:45 AM
msgrcvについて
解決できて良かったですね。