0

これが私がやりたいことです: (それはより大きな課題の一部です) そして、私はそれの開始時に立ち往生しています。

p1、p2 プロセスをフォークし、execlp (個別のプログラム) を使用するメイン プロセスを作成しました。p1.txt (プロセス p1) と p2.txt (プロセス p2) から 1 行につき 1 単語を読み取り、それをパイプに書き込むことになっています。次に、メイン プロセスで proc_pr がフォークされます (そのソース コードはありません)。これにより、パイプから単語を読み取り、それを 2 番目のパイプに書き込むときはいつでも SIGUSR 1 が送信されます。

p1 で簡単なコードを作成しようとしましたが、ほとんどの場合は機能しません。場合によってのみです。proc_pr の出力から、シグナルが p1 に送信された後、何も起こらないことがわかりました。open()、read()、lseek() を使用したソリューションを見てきましたが、fopen() と fgets() を使用しました。どんな助けでも大歓迎です。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>

#define MAXLENGTH 150               //definujme si maximalnu dlzku retazca

int fd; int data_processed;         //file deskriptor a premenna na pocitanie precitanych dat
char buff[150];                 //buffer
FILE *f;                    //smernik na prud suboru

/* odchytenie signalu, subor je uz otvoreny a fd nacitany */
void odchytenie(int sig)
{   
    /* read a line */
    if ( fgets ( buff, sizeof buff, f ) != NULL ) 
       {        
             /* write the line */
            fputs ( buff, stdout ); 

            /* store the word into pipe */
           write(fd,buff,strlen(buff));
       } 
       else 
        {
            //do something to stop the process and close the file
        }      

}

int main(int argc, char *args[])
{

 /* prevedieme retazec z parametra na cislo deskriptora pipe na zapis */
 fd = atoi(args[1]);

 /* otvorime subor p1 */
 f=fopen("p1.txt","r");

/* zabezpeci odchytenie signalu */
(void) signal(SIGUSR1,odchytenie);

/* pocka na signal, proces sa neukonci, ani sa nezavrie subor */
while(1) 
 {
    sleep(1);       
 } 

 /* close the file */ 
 fclose(f);

 /* exit with value 0 */
 exit(0);

}
4

1 に答える 1

0

うーん、私はそれを理解しました。問題はメインプロセスにありました。そして、おそらくハンドラーで非同期セーフ関数を使用する必要があります。

于 2013-05-11T07:49:27.633 に答える