C/C++で「`shm_open' に対する定義されていない参照です」というエラーになった場合の対処

April 13,2017 12:55 AM
Category:[C/C++]
Tag:[C/C++]
Permalink

C/C++で「`shm_open' に対する定義されていない参照です」というエラーになった場合の対処方法について紹介します。

1.問題点

shm_openとshm_unlinkを使用する下記のサンプルコードを書きました。

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
 
#define FILE_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)
 
int main() {
    int* ptr;
    int fd;
    int ret;
 
    fd = shm_open("/test",  O_CREAT | O_RDWR, FILE_MODE);
    if(fd == -1) {
        exit;
    }
 
    ret = ftruncate(fd, sizeof(int));
    ptr = mmap (0, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if(ptr == MAP_FAILED) {
        exit;
    }
    printf("ptr:%p\n", ptr);
 
    if (ret = shm_unlink("/test")) {
        fprintf (stderr, "shm_unlink(shm_struct) failed\n");
    }
    return 1;
}

このコードをコンパイルすると、下記のように「shm_openおよびshm_unlinkの実装が定義されていない」というエラーが発生します。

% gcc shm.c
/tmp/cctpXmiN.o: 関数 `main' 内:
shm.c:(.text+0x18): `shm_open' に対する定義されていない参照です
shm.c:(.text+0x7b): `shm_unlink' に対する定義されていない参照です
collect2: エラー: ld はステータス 1 で終了しました

ということで、「`shm_open' に対する定義されていない参照です」というエラーになった場合の対処方法について紹介します。

2.対処方法

調べたところ、コンパイルオプションに"-lrt"を付与することで解消します。

% gcc -lrt shm.c

"-l"はリンケージ時のライブラリ(ここではrt)を指定するためのオプションです。

Comments [0] | Trackbacks [0]

iptablesでhttp・https接続を許可する方法

April 11,2017 12:03 AM
Category:[Linux]
Tag:[]
Permalink

iptablesでhttp・https接続を許可する方法を紹介します。

1.問題点

使い回しのLinuxサーバにApacheをインストールしましたが、外部からアクセスするとタイムアウトが発生します。

Linux内部からのアクセスはOKなので、iptablesで接続が許可されていない可能性があります。

ということで、iptablesでhttp・https接続を許可する方法を紹介します。

2.iptablesでhttp・https接続を許可する

iptablesの設定状況を確認するには"-L"オプションを指定します。

情報が設定されていれば次のような内容が表示されます。

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ms-wbt-server
ACCEPT     udp  --  anywhere             anywhere            state NEW udp dpt:ntp
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

ちなみに、iptablesに何も設定していない状態であれば次のように表示されます。

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

また、"--line-numbers"を設定すれば、一番左に"num"が表示されます。

# iptables -L --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
2    ACCEPT     icmp --  anywhere             anywhere
3    ACCEPT     all  --  anywhere             anywhere
4    ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
5    ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ms-wbt-server
6    ACCEPT     udp  --  anywhere             anywhere            state NEW udp dpt:ntp
7    REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
 
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
 
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

iptablesのルールは上から適用されるようで、http接続を許可するための新しいルールは7番目のREJECTよりも上に設定する必要があります。

今回はすでにiptablesが設定された状態のため、5と6の間に新しいルール(http接続許可)を、下記のコマンドで追加します。

# iptables -I INPUT 6 -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

以下、パラメータの説明です。

"-I INPUT 6"でルールを追加する位置を指定します。「6」を指定したので5の直後にルールが追加され、既存の「6」以降のルールはひとつずつ後ろにずれます。

"--state NEW"は接続開始要求パケット(SYNパケット)のみ許可することを意味します。

上記のstateマッチを利用するため、"-m state"もペアで設定し、拡張モジュールを指定します。

"-p tcp"はTCPプロトコルを指定します。"-m tcp"もペアで設定し、拡張モジュールを指定します(/etc/sysconfig/iptablesでは暗黙的に設定されているもので、コマンドラインでは設定不要かも)。

"--dport 80"でポート番号80(http)を指定します。httpsの場合は80の部分が443になります。

"-j ACCEPT"で許可を指定します。

設定後の表示は次のようになります(赤色が追加された内容)。

# iptables -L --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
2    ACCEPT     icmp --  anywhere             anywhere
3    ACCEPT     all  --  anywhere             anywhere
4    ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
5    ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ms-wbt-server
6    ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:http
7    ACCEPT     udp  --  anywhere             anywhere            state NEW udp dpt:ntp
8    REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
 
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
 
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

設定変更後、iptablesを再起動しなくてもhttp接続OKになりました。

3.iptablesの設定を削除する

もしiptablesの設定を削除したいのであれば、

# iptables -F

を実行します。

4.参考サイト

参考サイトは下記です。ありがとうございました。

Comments [0] | Trackbacks [0]

楽天トラベルで領収書を取得する方法

April 7,2017 12:03 AM
Category:[その他]
Tag:[Rakuten]
Permalink

楽天トラベルで領収書を取得する方法を紹介します。

1.はじめに

会社の出張で楽天トラベルを使ってホテルを予約しました。

出張後、会社にホテルの領収書提示が必要だったのですが、フロントでもらうのをうっかり忘れてしまいました。

なんとかならないか調べてみたところ、楽天トラベルで予約した場合、オンラインで領収書を発行してもらえることが分かりました。

ということで、楽天トラベルで領収書を取得する方法を紹介します。

2.領収書を取得する

領収書を取得するには、楽天トラベルのページからログイン。

楽天トラベルのページ

「予約の確認・キャンセル」をクリック。

予約の確認・キャンセル

「キャンセル済・過去の予約」をクリック。

予約の確認・キャンセル

該当予約の「領収書発行」をクリック(画面は2回目なので「再発行」になっています)。

(クリックで拡大)
領収書発行

宛名を適切な内容に変更して「宛名確認へ」をクリック。

宛名確認へ

宿泊所の住所をいれたい場合はチェックボックスをチェックして「領収書発行」をクリック。

領収書発行

このあと領収書画面が表示されるので、印刷すればOKです。

領収書は「発行」と「再発行」で2回まで表示できるようです。

Comments [0] | Trackbacks [0]
 1  |  2  |  3  |  4  |  5  | All pages