0

2 つのプロセスが通信するこのアプリケーションを作成しました。すべて順調ですが、ユーザーが esc を押すとプロセスが自動的に終了するようにしたいと考えています。s*また、ユーザーから 1 行しか取得していません。一度に 1 つのプロセス*。2 行目に入る前に、他のプロセスにも行を追加する必要があります。ここにプロセス1のコードがあります(私はサーバーと呼ばれます)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/errno.h>
extern int      errno;
#define FIFO1   "/tmp/fifo.1"
#define FIFO3   "/tmp/fifo.3"
#define PERMS   0666
#define MESSAGE1        "client Says:"

main()
{
    char buff[BUFSIZ];
    int readfd, writefd;
int n, size;
    if ((mknod (FIFO1, S_IFIFO | PERMS, 0) < 0) && (errno != EEXIST)) {
        perror ("mknod FIFO1");
        exit(1);
    }
    if (mkfifo(FIFO3, PERMS) < 0 && (errno != EEXIST)) {
        unlink (FIFO1);
        perror("mknod FIFO3");
        exit(1);
    }
    if ((readfd = open(FIFO1, 0)) < 0) {
        perror ("open FIFO1");
        exit(1);
    }
    if ((writefd = open(FIFO3, 1)) < 0) {
        perror ("open FIFO3");
        exit(1);
    }
///////////////////////////////////////////////////////////////////////////////////////////////////////
loop:
 while(1)
{



    if ((n = read(readfd, buff, 100)) < 0) {
        perror ("server read"); exit (1);
    }

write(1,MESSAGE1,strlen(MESSAGE1));
if (write(1, buff, n) != n) {
            perror ("client write2"); exit(1);
        }


/////////////////////////////////////////////////////////////////////////////////////////////


while(1)
{

printf("server says:");
//strcpy(buff,"I say:");
fgets(buff,100,stdin);
n=strlen(buff) + 1;
    if (write(writefd, buff,n) < n) {
        perror("server write1"); exit (1);
    }
goto loop; 
}

}//end of first for 
    close (readfd); close (writefd);
}

2番目のプロセス(私はクライアントと呼ばれます)

#include <stdio.h>
#include <string.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/errno.h>
extern int      errno;
#define FIFO1   "/tmp/fifo.1"
#define FIFO3   "/tmp/fifo.3"
#define PERMS   0666
#define MESSAGE1        "server Says:"


main()
{
    char buff[BUFSIZ];
char buf[]="logout";
    int readfd, writefd, n, size;
    if ((writefd = open(FIFO1, 1)) < 0) {
        perror ("client open FIFO1"); exit(1);
    }
    if ((readfd = open(FIFO3, 0)) < 0) {
        perror ("client open FIFO3"); exit(1);
    }
///////////////////////////////////////////////////////////
loop:
while(1)
{

printf("client says:");
fgets(buff,100,stdin);
n=strlen(buff) + 1;
    if (write(writefd, buff,n) < n) 
    {
        perror("server write1"); exit (1);
        }

////////////////////////////////////////////
while(1)
{


    if ((n = read(readfd, buff, 100)) < 0) 
    {
        perror ("client read"); exit(1);
        }


    write(1,MESSAGE1,strlen(MESSAGE1));
        if (write(1, buff, n) != n) 
        {
            perror ("client write2"); exit(1);
        }


goto loop;
}
}//end of first for
    close(readfd); close(writefd);
     /* Remove FIFOs now that we are done using them */
    if (unlink (FIFO1) < 0) {
        perror("client unlink FIFO1");
        exit(1);
    }
    if (unlink (FIFO3) < 0) {
        perror("client unlink FIFO3");
        exit(1);
    }
    exit(0);
}
4

1 に答える 1

3

私の理解が正しければ、2 つのプログラムを非ブロッキングにする必要があります。つまり、ユーザーまたはパイプから読み取ることができる必要があります。

その場合は、selectシステムコールを調べることをお勧めします。任意のファイル記述子からの入力をポーリングするために使用できます。

次の疑似コードのようなことができます。

while (1)
{
    /* Poll for input */
    select(...);

    if (is_pipe_readable())
        read_from_pipe_and_print_to_stdout();
    else if (is_stdin_readable())
        read_from_stdin_and_write_to_pipe();
}

ファイル記述子は、閉じられると読み取り可能になることに注意してください。したがって、パイプの書き込み側が閉じている場合、読み取り側は読み取り可能になり、readゼロが返されます。

于 2013-03-13T11:04:29.560 に答える