• 締切済み

プログラミング

プログラミング教えてください 子プロセスはsleep時間をカウントし、シグナルSIGTSTP受信後、親プロセスにsleep時間をパイプラインで通知し親プロセスは、 sleep時間をプリントして終了せよ 上のプログラムが親で、下が子です。子のプログラムに付け足すだけでいいです。 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <time.h> int main() { char read_fd[3],write_fd[3]; int fd[2],st; time_t result; if (pipe(fd)<0) { perror("pipe"); exit(EXIT_FAILURE); } snprintf(read_fd,sizeof(read_fd),"%d",fd[0]); snprintf(write_fd,sizeof(write_fd),"%d",fd[1]); if (fork()==0) { if (execl("hw6-c","hw6-c",read_fd,write_fd,NULL)<0) { exit(EXIT_FAILURE); } } else { signal(SIGTSTP,SIG_IGN); // 親は Ctrl-Zを無視 } wait(&st); read(fd[0],&result,sizeof(result)); printf("elapsed time = %ld\n",result); close(fd[0]); close(fd[1]); return EXIT_SUCCESS; } #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <unistd.h> time_t start; int read_fd,write_fd; int main(int argc,char *argv[]) { void stop(); read_fd=atoi(argv[1]); write_fd=atoi(argv[2]); signal(SIGTSTP,stop); time(&start); while (1) { sleep(1); printf(":"); fflush(stdout); } } void stop() { time_t end; この部分を考えて下さい Ctrl-Z後に子が行うことを書く 1)終了時刻(end)を測定 2)end-startをパイプバッファに書く close(read_fd); close(write_fd); exit(EXIT_SUCCESS); }

みんなの回答

回答No.1

回路やプログラミング関連の質問を連日質問をして、 そして折角丁寧に貰った回答に禄にお礼コメントもせずに次の質問を乱立させて、 学校の課題なら少しは自分で考えたらどうですか? 高い学費を出して入学させてその結果がこれなら親が泣きますよ?

関連するQ&A

  • プログラミング

    emacsにて子プロセスの実行時間を測定するプログラムを作成せよ。 尚、子プロセスは5秒間sleep後、exitする。 下のプログラムに2行付け加えるだけなんですが教えてください #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> time_t start, end; int main() { int j; time(&start); // start if (fork()==0) { この部分に、5秒間スリープ後、exit()するプログラムを書く。 2行です。子プロセスの実行結果(EXIT_SUCCESS)も忘れずに入れる。 } wait(&j); time(&end); // stop printf("elapsed time= %d seconds\n", (int) (end-start)); return EXIT_SUCCESS; }

  • 大文字を小文字に、小文字を大文字にするプログラム

    問題は、 ファイルにあるアルファベットの大文字を小文字に変換し、小文字は大文字に変換して、ファイルに保存するプログラムを作りなさい というものです。 色々考えて、 #include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <unistd.h> #include <ctype.h> int main(int argc,char **argv){ int fd,flag1,flag2; int i,n; char buffer[512],x; fd = open(argv[1],O_RDWR); if(fd == -1) perror("open"); while((n = read(fd,buffer,sizeof(buffer)))>0){ x = buffer[i]; flag1 = islower(x); flag2 = isupper(x); for(i=0;i<n;++i) if(flag1 == 1){ buffer[i] = toupper(buffer[i]); }else if(flag2 == 1){ buffer[i] = tolower(buffer[i]); } write(fd,buffer,n); } close(fd); exit(0); } のようなプログラムを考えましたが、うまくいきません。 toupperのような関数を使ったのは初めてなのでよく使い方が分からずこのようなプログラムになってしまいました。 どうか正しく動くようなプログラムを教えてください。お願いします。

  • テキストファイルが開けません。

    main関数に2つの引数をとり、第1引数で指定したファイルの内容を第2引数で指定したファイルにコピーするプログラムを以下のように作りました。 #include<stdio.h> #include<fcntl.h> int main(int argc, char* argv[]){ int fd1, fd2, rs, ws; char buffer[10000]; if(argc!=3){ write(2, "使用法:実行ファイル コピー元ファイル コピー先ファイル\n", 54); exit(1); } fd1=open(argv[1], O_RDONLY); if(fd1<0){ fprintf(stderr, "can't open file '%s'.\n", argv[1]); exit(1); } fd2=open(argv[2], O_WRONLY|O_CREAT|O_TRUNC); if(fd2<0){ fprintf(stderr, "can't open file '%s'.\n", argv[2]); exit(1); } while((rs=read(fd1, buffer, 10000))>0){ if((ws=write(fd2, buffer, rs))!=rs){ write(2, "an error occurred while copying.\n"); exit(1); } } close(fd1); close(fd2); } コンパイル、実行ともに正常終了したのですが、 コピー先のテキストファイルを開こうとすると、 「アクセスは拒否されました。」というダイアログが表示されて 開くことができません。 なぜなのでしょうか。 よろしくお願いします。 ちなみにOSはWindows Vistaで、 プログラムはcygwin上で実行しました。

  • C言語で自作したcpコマンドが上手く動作しません

    当方、プログラミングを勉強中の学生です。 先日、ファイル入出力関数を用いてcpコマンドを自作しました。 一応、コンパイルは通るのですが、コピーしたファイルを開くことができません。 そのファイルのパーミッションを確認してみたところ 「----------」となっており、読み書き実行すべて不可となっていました。 ソースは以下の通りなのですが、何が問題でしょうか。 回答よろしくお願い致します。 #include<stdio.h> #include<fcntl.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/uio.h> #include <unistd.h> #define SIZE 8192 int main(int argc, char *argv[]) { int fd1, fd2; char buf[SIZE]; if ( argc != 3 ){ char err_message[] = "ファイル名を指定して下さい。\n"; write(2, err_message, strlen(err_message)); return 1; } argv[0] = "mycopy"; fd1 = open(argv[1], O_RDONLY); fd2 = open(argv[2], O_WRONLY | O_CREAT); if (fd1 < 0 || fd2 < 0) { char err_message[] = "ファイルをオープンできません。"; write(2, err_message, strlen(err_message)); write(2, strerror(errno), strlen(strerror(errno))); write(2, "\n", 1); return 1; } while(1) { if (read(fd1, buf, SIZE) == 0) { break; } else if (read(fd1, buf, SIZE) > 0) { write(fd2, buf, SIZE); } else { char err_message[] = "エラーが発生しました。"; write(2, err_message, strlen(err_message)); write(2, strerror(errno), strlen(strerror(errno))); write(2, "\n", 1); return 1; } } close(fd1); close(fd2); return 0; }

  • C言語 エラーチェックについて

    初めまして。分からないところがあったので質問させていただきます。 以下のプログラムは引数から値を取得し、その値で生データの切り出しを 行うプログラムです。 read関数のところなのですが、argv[1]に格納されたファイル(パス名)が0byteでもエラーが出力されずに、コンパイルされてしまいます。 どうすればよいのでしょうか? さらに、上司にreadとwriteにエラーチェックのメッセージをつけろ。と言われたのですが、どうやれば良いのかよく分かりませんでした。if()~とすれば良いのでしょうか?初心者なので分かりにくい質問かと思いますが、どうぞよろしくお願いします。 #pragma warning ( disable : 4996 ) #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <io.h> #include <sys/stat.h> #define ONESEGSIZE 2048 void main ( argc, argv ) int argc; char *argv[]; { int fd, fd2; // ファイルハンドル int segment; // 列数 int raw_n; // 切り出す生データの数 int tviews; // 総ビュー数 int start_view; // 切り出し開始ビュー int size_view; // 切り出しサイズ int pitch_view; // 切り出しピッチ char *Rawdivit; // コマンド char *raw_file; // 生データファイル名 char *outraw_file; // 生データ出力ファイル名 char *mem; // メモリ変数 /* パラメータの個数チェック */ if ( argc != 9 ) { printf( "usage : Rawdivit raw_file outraw_file segment raw_n" " tviews start_view size_view pitch_view \n" ); exit ( 1 ); } /* 引数の取得char型 */ Rawdivit = argv[0]; raw_file = argv[1]; outraw_file = argv[2]; /* 引数の取得int型 */ segment = atoi ( argv[3] ); raw_n = atoi ( argv[4] ); tviews = atoi ( argv[5] ); start_view = atoi ( argv[6] ); size_view = atoi ( argv[7] ); pitch_view = atoi ( argv[8] ); /* 生データファイルオープン */ fd = open ( raw_file, O_RDONLY | O_BINARY ); if ( fd == -1 ) { printf ( "Fileopen error : read\n" ); exit ( -1 ); } /* 生データ読み込み用メモリ確保 */ mem = ( char * ) malloc ( ONESEGSIZE * segment * size_view ); // 単位 = byte if ( mem == NULL ) { printf ( "Memorysecure error\n" ); exit ( -1 ); } /* 切り出し開始位置までファイルポインタをシーク */ lseek ( fd, ONESEGSIZE * segment * start_view, SEEK_SET ); /* 切り出しサイズ分読み込み */ read ( fd, mem, ONESEGSIZE * segment * size_view ); /* 出力ファイルオープン */ fd2 = open ( outraw_file, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, S_IREAD | S_IWRITE ); if ( fd2 == -1 ) { printf ( "Fileopen error : write\n" ); exit ( -1 ); } /* 読み込んだデータを出力ファイルに書き込み */ write ( fd2, mem, ONESEGSIZE * segment * size_view ); /* メモリの開放 */ free ( mem ); /* ファイルクローズ */ close ( fd ); close ( fd2 ); exit ( 0 ); }

  • このプログラムの動作について教えてください

    #include<stdio.h> #include<unistd.h> #define SIZE 10 int main(int argc,char *argv[]){ int fd; char buf[SIZE]; fd=open("data",0); read(fd,buf,10) write(1,buf,10); close(fd); rerutn 0; } というプログラムで dataの中身が以下のテキストファイルとなっているようなのんですが dataの内容:abcdefghijklmnopqrstuvwxyz このプログラムの出力結果がabcabcabce となるとの事なのですが何故でしょうか? 普通に先頭から10バイト分読み込んで出力するならabcdefghijとなるのではないのでしょうか? どうぞご教授お願いします

  • mmapで自作cat

    はじめまして。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 }

  • TCP/IP通信型電話番号検索プログラムを作りたいです。

    TCP/IP通信型電話番号検索プログラムを作りたいです。 クライアントは以下のようで大丈夫みたいなのですが、サーバの方を修正しなければなりません。 この質問で「TCP/IP通信型大文字・小文字変換プログラム」を発見しました。 サーバー側プログラム #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #define SOCK_NAME "./socket" int main() { int i; int fd1, fd2; struct sockaddr_in saddr; struct sockaddr_in caddr; int len; int ret; char buf[1024]; if((fd1 =socket(AF_INET, SOCK_STREAM, 0)) < 0 ){ perror("socket"); exit(1); } memset((char *)&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr=INADDR_ANY; saddr.sin_port=htons(1357); unlink(SOCK_NAME); if(bind(fd1, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) { perror("bind"); exit(1); } if(listen(fd1,5) < 0 ) { perror("listen"); exit(1); } while(1){ len = sizeof(caddr); if((fd2 = accept(fd1, (struct sockaddr *)&caddr, &len)) < 0){ perror("accept"); exit(1); } fprintf(stderr, "Connection established: socket %d used.\n", fd2); while((ret = read(fd2, buf, 1024)) > 0 ){ fprintf(stderr, "read: &s\n", buf); for(i=0; i<ret; i++) if(islower(buf[i])) buf[i] = toupper(buf[i]); if(isupper(buf[i])) buf[i] = tolower(buf[i]); fprintf(stderr, "write: %s\n", buf); write(fd2, buf, 1024); } close(fd2); } close(fd1); return 0; } 先生によると、クライアントは同じもので良いそうです。 誰か、助けて下さい。

  • C言語のシェルプログラミングの課題が分かりません。

    C言語のシェルプログラミングを作れという課題で、以下のように作ったんですが、実行して何度かコマンドを入力した後、exitによって一発で終わらせることができません。どのように書き換えればいいか教えて下さい。 また、他にも書き換えた方がよいと思えるところがあったら是非教えて下さいm(_ _)m #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/wait.h> #include <sys/types.h> #include MAX_ARGS 10 #include MAX_LEN 100 extern char **environ; void child(int argc, char *argv[MAX_ARGS]); int main(void){ int argc, n = 0; int status; char input[MAX_LEN], *argv[MAX_ARGS], *cp; const char *delim = "\t\n"; while (1){ ++n; printf("$ "); fflush(stdout); if(fgets(input, sizeof(input), stdin) == NULL){ break; } cp = input; for(argc = 0; argc < MAX_ARGS; argc++){ if((argv[argc] = strtok(cp, delim)) == NULL) break; cp = NULL; } if(strcmp(argv[0], "exit") == 0){ exit(0); } pid_t pid = fork(); if(pid == -1){ perror("fork"); exit(1); }else if(pid == 0){ child(argc, argv); }else{ wait(&status); } } return 0; } void child(int argc, char *argv[MAX_ARGS]{ execvp(argv[0], argv); }

  • プログラミング

    教えてください。以下のプログラムを修正してソケットを使った残高照会プログラムを作成。 関数searchdata(long key, char *dp, int size)を最後に追加する。 #include <stdio.h> /* for printf() and fprintf() */ #include <sys/socket.h> /* for recv() and send() */ #include <unistd.h> /* for close() */ #include <string.h> #define RCVBUFSIZE 32 /* Size of receive buffer */ int searchdata(long key, char *dp, int size); long id; void DieWithError(char *errorMessage); /* Error handling function */ void HandleTCPClient(int clntSocket) { char echoBuffer[RCVBUFSIZE]; /* Buffer for echo string */ int recvMsgSize; /* Size of received message */ /* Receive message from client */ if ((recvMsgSize = recv(clntSocket, echoBuffer, RCVBUFSIZE, 0)) < 0) DieWithError("recv() failed"); sscanf(echoBuffer, "%ld", &id); if (searchdata(id,echoBuffer,sizeof(echoBuffer))==EOF) { snprintf(echoBuffer,sizeof(echoBuffer),"%ld",0L); } if (send(clntSocket, echoBuffer, strlen(echoBuffer), 0) != strlen(echoBuffer)) DieWithError("send() failed"); close(clntSocket); /* Close client socket */ }

専門家に質問してみよう