• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:linux cプログラムソース中のクリティカルコードの排他処理について)

Linux Cプログラムソースのクリティカルコードの排他処理について

このQ&Aのポイント
  • Linux Cプログラムソース中のクリティカルコードの排他処理について解説します。
  • 質問者が見つけたサンプルコードを紹介し、コンパイル時のエラーと実行時のコアダンプについて説明します。
  • そして、割り込み禁止にして排他処理を行う方法についてアドバイスします。

質問者が選んだベストアンサー

  • ベストアンサー
  • onosuke
  • ベストアンサー率67% (310/456)
回答No.1

上のコードそのままなら、特権不足に跳ねられるでしょうし、下のコードでもrootじゃなければ、iopl()が失敗して同様です。 man 2 iopl を参照して、ちゃんとエラー処理をしましょう。

kaede-sg
質問者

お礼

どちらのコードもrootでコンパイル・実行していますが、fprintf(stderr,"number")を使うと、cli()でエラーが出てしまいます。 上のコードそのままだと特権不足というのは、 書き足す必要のあるコードがあるのですか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • LinuxでのC言語通信プログラムについて

    サーバーとクライアントで足し算を行うプログラムを実行するとサーバーからの計算結果が返ってきません。ソースコードは以下に示します。 クライアントのプログラム #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> int main(void) { int sockfd ; int tolen , fromlen ; struct sockaddr_in to_address , from_address ; int result ; int ch[3] ; sockfd = socket(AF_INET,SOCK_DGRAM,0); to_address.sin_family = AF_INET ; to_address.sin_addr.s_addr = INADDR_ANY ; to_address.sin_port = htons(9734) ; tolen = sizeof(to_address); bind(sockfd , (struct sockaddr *)&to_address , tolen); printf("A = "); scanf("%d",&ch[0]); printf("B = "); scanf("%d",&ch[1]); sendto(sockfd , ch , sizeof(ch) , 0 , (struct sockaddr *)&to_address , tolen); recvfrom(sockfd , ch , sizeof(ch) , 0 , (struct sockaddr *)&from_address , &fromlen); printf("A + B = %d \n",ch[2]); close(sockfd); exit(0); } サーバーのプログラム #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> int main(void) { int ch[3] ; int sockfd ; int tolen , fromlen ; struct sockaddr_in to_address ; struct sockaddr_in from_address ; sockfd = socket(AF_INET,SOCK_DGRAM,0); to_address.sin_family = AF_INET ; to_address.sin_addr.s_addr = INADDR_ANY ; to_address.sin_port = htons(9734) ; tolen = sizeof(to_address); bind(sockfd , (struct sockaddr *)&to_address , tolen); while(1) { printf("server waiting\n"); recvfrom(sockfd , ch , sizeof(ch) , 0 , (struct sockaddr *)&from_address , &fromlen); ch[2] = ch[0] + ch[1] ; sendto(sockfd , ch , sizeof(ch) , 0 , (struct sockaddr *)&from_address , fromlen); } }

  • dos.hについて

    outportbなどの関数を使用しようとして dos.hをインクルードしているのですが bccでコンパイルするとエラーをはきます。 原因がわかる方いれば教えてください。 下記にソースを載せています。 #include <dos.h > void outportb(unsigned int portid,unsigned char value){ _asm mov edx,portid _asm mov al,value _asm out de,al } エラーは エラー E2451 080311-1.c 6: 未定義のシンボル de(関数 outportb ) *** コンパイル中に 1 個のエラーが発生しました *** とでます。

  • C言語ソースコードに関する質問です。

    以下の数列について,初項から第15項までを求めるプログラムと実行結果を示せ。 0 1 1 2 3 5 8 13 21(ただし,初項=0,第1項=1とする。) ソースコードを書くと、エラーがでた。 #include <stdio.h> int fib(int n) { if(n==1 || n==2) return 1; else return fib(n-1)+fib(n-2); } int main(void) { int n; for(n=0;n<17;n++) printf("%d,",fib(n)); } 正しソースコードを教えてください! よろしくお願いします。

  • LaTeXでソースコード

    LaTeXで文書中にソースコードを 行番号付きで載せるのはlistings.styを使ってできたのですが、 行番号 + “:”(セミコロン)で表示するような方法はないでしょうか。 例えば、こんな風にです 1: #include <stdio.h> 2: 3: int main(void){ 4: printf("hello\n"); 5: return 0: 6: }

  • C言語のコードについて

    C言語の問題なのですか、作成したのですが内容がわからないです。 コードをわかりやすく解説していただけると嬉しいです。 #include <stdio.h> void printBinary(unsigned char num) { int i ; /*①上位ビットから順に表示する*/ for(i = 7 ; i >= 0; i--) { /*②シフトとマスクを使用しています。*/ printf("%d", (num>>i) &0x01 ); } printf("\n"); } int main(void) { unsigned char num1 = 0xD2;/*11010010*/ unsigned char num2 = 0x5E;/*01011110*/ printf("0xD2 : "); printBinary(num1); printf("0x5E : "); printBinary(num2); return 0; }

  • GCCの#includeパスの設定方法?

    RedHat Linux 8.0をインストールしています。adaptec社のAHA1542を使いたいのですが、自動認識してくれません。 色々調べた結果、/etc/modules.confに alias scsi_hostadapter aha1542.o を記述する事で、使用可能と言う事がわかりました。 しかし私のシステムでは、aha1542のソースとヘッダーファイルはありますが、オブジェクトがありません。 GCCにてコンパイルさせたら、大量のエラーメッセージが出力されます。ソースを見ると、 1) #include <linux/******.h> 2) #include <asm/*****.h> 3) #include "*****.h" と3種類の#include文があります。 3)は、ソースと同一ディレクトリーでOKだと思いますが、他の2種類のパスの設定方法がわかりません。 <linux/ <asm/ の部分を自分のシステムに合ったパスに置き換える(GCCに認識させる)には、どうすれば良いのでしょうか? どうか、宜しくお願い致します!

  • C言語でサイコロのプログラムを作ってみたのですが

    まず、以下のような”実行するたびに1~6の数字をランダムに出力するプログラム”を 作ってみたのですが、特定の数字が出てこないのです。 例えば、1と4、2と5、3と6 が出ない ここで気がついた事は、 1、出ない目の2数の差は3であること。 2、乱数自体を表示させたところ、ちゃんと1秒毎に乱数は変わっている。こちらには問題はない 3、約1分間隔で、出ない数字の組み合わせが変わる。 (例えば 1,3,4,6,1,6,3,6,4(2と5が出ない)  →1分間実行し続けると・・・  2,3,6,5,3,2,2,6(1と4が出ない)) この原因は一体なんなのでしょうか・・・ とても気になって仕方がありません。わかる方教えてください。 以下、ソースコードになります #include<stdio.h> #include<time.h> #include<stdlib.h> int func(void); int main(void){ int number=0; number=func(); //サイコロの目の表示 printf("%d\n",number); return 0; } int func(){ //乱数の初期化 srand((int unsigned)time(NULL)); //サイコロの目をランダムで出力し、返す return rand()%6+1; } プログラムの仕組みは パソコンから現在の歴時刻を元に乱数の初期値を変更 ↓ rand関数で適当な値を受け取り、6で割った余剰+1を計算し値を返却する

  • Cのソースコードについて

    以下のソースコードをかきました。 #include<stdio.h> #include<string.h> #define MAX 100005 typedef struct PP { int t; char name[100]; }P; P Q[MAX]; int head, tail, n; void enqueue(P u) { Q[tail] = u; tail = (tail + 1) % MAX; } P dequeue() { P x = Q[head]; head = (head + 1) % MAX; return x; } int min(int a, int b) { return a > b ? a : b; } int main() { int q, sum = 0 , w; scanf("%d %d", &n,&q); for (int i = 1; i <= n; i++){ scanf("%s", Q[i].name); scanf("%d", &Q[i].t); } head = 1; tail = n + 1; P u; while (head != tail) { u = dequeue(); w = min(q, u.t); sum += w; u.t -= w; if (u.t > 0)enqueue(u); else { printf("%s %d", u.name, sum); } } return 0; } これでVisual C++ でコンパイルしたところ特にエラーも起きず問題なく動作しました しかしAOJに提出してみたところコンパイルエラーになってしまい詰んでしまいました どこかダメそうなところがあれば教えてください

  • 関数ライブラリ一覧

    C言語の関数一覧のようなものは何を見たらわかるのでしょうか? 標準関数の一覧はよく見かけますが、ほかの関数の一覧はないのでしょうか? たとえば、あるインターネット上で公開されていたソースコードには #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <netinet/in.h> #include <sys/param.h> #include <sys/uio.h> #include <unistd.h> と書いてありました。 上3つは標準ライブラリにかいてありますが、その他は載ってません。 こういったsys/uio.hなどの仕様はどこで見れるのでしょうか? よろしお願いします。

  • GNUから、cat.cのソースコードを手に入れたが、コンパイルできない

    OSは、Ubuntu 8.04 LTSを使用しています。 C言語の勉強をしようと思い、 http://cvs.savannah.gnu.org/viewvc/coreutils/coreutils/src/ からcat.cのソースコード(1.113)を手に入れました。 ただ、試しにコンパイルをしようとすると、以下のようなエラーが出てコンパイルできません。 --- cat.c:24:20: error: config.h: No such file or directory cat.c:37 から include されたファイル中: system.h:56:21: error: pathmax.h: No such file or directory system.h:58:24: error: configmake.h: No such file or directory system.h:123:22: error: exitfail.h: No such file or directory In file included from cat.c:37: system.h: In function ‘initialize_exit_failure’: system.h:130: error: ‘exit_failure’ undeclared (first use in this function) system.h:130: error: (Each undeclared identifier is reported only once system.h:130: error: for each function it appears in.) system.h:236:25: error: stat-macros.h: No such file or directory system.h:238:22: error: timespec.h: No such file or directory system.h:266:21: error: gettext.h: No such file or directory 以下、エラー文が続く --- 何かをインストールする必要があるらしいことは分かるのですが、具体的に何をインストールすれば良いのかが分かりません。初歩的な質問で申し訳ありませんが、お教え願えないでしょうか?

このQ&Aのポイント
  • 一言表示の使い方について詳しく説明します。
  • 具体的な手順を追って一言表示の使い方をご紹介します。
  • 一言表示を理解するための具体的な例を解説します。
回答を見る