重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

プログラミングの問題教えてください
子プロセスは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);
}

質問者からの補足コメント

  • tera term pro のemacsで実行してみたんですが
    ::::::::::::::::::::::::::がずっと続くだけでした

    gcc ~.c -o ~と実行したんですが

      補足日時:2015/05/27 17:15
  • ctrl-Zを押しても
    ::::::::^Z
    となります

      補足日時:2015/05/27 17:28

A 回答 (1件)

以下の部分を追加してください。


----------------------
time_t result;
time(&end);
result = end - start;
write(write_fd,&result,sizeof(result));
-----------------------
以下実行結果
::::::^Zelapsed time = 6

CentOS release 6.3
gcc version 4.4.6
で動作確認しました。
不明点は、補足にて質問してください。
    • good
    • 2
この回答へのお礼

あ、ぼくの勘違いでした
できました。ありがとうございました

お礼日時:2015/05/27 17:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!