はじめまして。C言語(というかプログラミング自体)まったくの初心者です。
mmapで自作catコマンドを作りたいのですが、
以下のソースコードでコンパイルできたものの、
a.outするとsegmentation faultとなってしまいます。
もしよろしければ何がいけないか、ご指摘いただけると嬉しいです。
1 #include<sys/types.h>
2 #include<sys/stat.h>
3 #include<sys/mman.h>
4 #include<fcntl.h>
5 #include<unistd.h>
6 #include<stdio.h>
7 #include<string.h>
8
9 int main (int argc, char*argv[]){
10
11 int fd;
12 char *m;
13 int size;
14
15 if(argc < 3){
16 open(argv[1],O_RDWR);
17 }
18
19 fd = open(argv[1], O_RDWR);
20 if(fd < 0){
21 printf("error\n");
22 }else{
23 fseek(0, 0L, SEEK_END);
24 size = ftell(0);
25 }
26
27 m = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
28
29 if(m == MAP_FAILED){
30 printf("error\n");
31 }else{
32 write(1,m,strlen(m));
33
34 close(fd);
35 return 0;
36 }
37 }
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
23行目のfseek()の最初の引数が 0 なのがおかしいです。
これが segmentation fault の原因です。ファイルポインタでなければいけません。ファイルディスクリプタの0番は指定できません。標準入力を意図したなら。そもそもfopen()ではなくopen()でファイルを開いていますね。それなら23,24行目は下記のようにしてファイルサイズを調べた方がよいでしょう(これはファイルからの読み込みだけで標準入力は考えていません)。
struct stat status;
if (fstat(fd, &status)) {
printf("error\n");
close(fd);
return 1;
}
size = (int) status.st_size;
15 ~ 17 行目は無意味ですね。コマンドライン引数が無いときエラーとすればよいでしょう。
if(argc < 2){
printf("error\n");
return 1;
}
21行目と30行目の直後も、エラー終了するためのreturnかexitを入れ忘れていますね。
まずは、プログラムをよく見直した方がよいでしょう。
No.2
- 回答日時:
色々と原因が考えられます。
もうすこし落ち着いて、何をやっているのか考えた方がよいでしょう。
少なくとも、自分で書いたプログラムくらい解説できるくらいでないと。
勉強中なら、このようなことするには早すぎると思います。
> 15 if(argc < 3){
> 16 open(argv[1],O_RDWR);
> 17 }
ここでは何をやっているのですか?argc<3との関連が意味がわかりません。
openした結果を何も使ってません。
> 19 fd = open(argv[1], O_RDWR);
> 20 if(fd < 0){
> 21 printf("error\n");
> 22 }else{
> 23 fseek(0, 0L, SEEK_END);
> 24 size = ftell(0);
> 25 }
19で失敗すると、21行を実行します。ただそのまま26行目以降も実行していくので、
・失敗してファイルが開けず、-1が入ったままのfd
・初期化されていないため、なには入っているかわからないままのsize
が
> m = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
に渡されます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンソールAPIのSetConsoleScre...
-
c言語プログラミングで初項を1....
-
C言語初心者です。計算がうまく...
-
TCP/IP: 非ソケットに対するソ...
-
最も文字数が多い行番号と文字...
-
情報の問題です。 サンプリング...
-
クレーンでのCFブレーキとな...
-
順列、4桁の整数をつくる問題
-
(2x-1)2乗=5の答えを解説付き...
-
遅れ時間の多い系でのPID設...
-
中学数学空間図形の問題です。 ...
-
「dip and plateau」の訳
-
RCフィルタと三角波、方形波
-
SNR測定方法の差分法について質...
-
中学数学立体の問題です。 (2...
-
互いに素と負の数
-
積分率について
-
定常応答 と 強制応答 は同...
-
オシロスコープのDCとAC
-
平滑筋と骨格筋の制御機構
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語プログラミングで初項を1....
-
プログラミングが分かりません。
-
'printf':識別子が見つかりませ...
-
C言語のエラーについて
-
Expression: nptr != NULL
-
TCP/IP: 非ソケットに対するソ...
-
3×3のラテン方陣をつくるプログ...
-
加減剰余のオーバーフローについて
-
プログラムがエラーが出る原因
-
getch / putch用のヘッダ
-
コマンドライン引数について。
-
C言語で自作ヘッダーを作ったの...
-
コンソールAPIのSetConsoleScre...
-
分割コンパイルの手順と方法に...
-
C言語 コンパイルエラー(文字...
-
リターンキー又は、スペースキ...
-
C言語初心者です。計算がうまく...
-
最も文字数が多い行番号と文字...
-
モンテカルロ法で三角錐の体積...
-
C言語のソースコードについて教...
おすすめ情報