簡體   English   中英

在C / Linux中使用命名管道和fork

[英]Using named pipes and fork in C / Linux

我正在嘗試編寫一個簡單的控制台應用程序,該應用程序從用戶讀取文本,然后將小寫字母更改為大寫字母,最后在控制台中打印結果。 當我僅使用一個管道(例如,不從控制台讀取文本)時,它工作正常,但是當我使用兩個管道時,則完全無法預測。

'[Write]'是否不應該等待'[To upper]'直到發送文本?

我得到以下輸出:

[寫]等待txt顯示。
[上方]等待txt更改。
[寫]收到以下文本:
[上方]收到txt()。
[上方]更改后的txt發送至[Write]()。
[掃描]輸入您的txt:
[掃描]接收到Txt。 發送至[至上](y)

我的代碼:

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#define SIZE 16
int main()
{
    int i=0;
    int f1,f2;
    char x[SIZE]={0};
    if( fork() )    
    {
        if( fork() )//[Write]
        {
            f1=open("upper-write",O_RDONLY);
            puts( "[Write] Waiting for txt to diplay." );
            read( f1, &x, sizeof( x ) );
            printf( "[Write] Received following txt: %s\n", x );
            close( f1 );
        }
        else//[Scan]
        {
            puts( "[Scan] Type your txt: " );
            //scanf ("%15s",x);//scanf not working now, so I change my char array by myself     
            x[0]='y';
            f2=open("scan-upper",O_WRONLY);
            printf( "[Scan] Txt received. Sending to [To upper] (%s)\n", x );
            write( f2, &x, sizeof( x ) );
            close( f2 );
        }
    } 
    else//[To upper]
    {
        puts( "[To upper] Waiting for txt to change." );
        f2=open("scan-upper",O_RDONLY);
        read( f2, &x, sizeof( x ) );
        close( f2 );

        printf( "[To upper] Received txt (%s).\n" ,x);  
        for(i=0;i<SIZE;i++)
            if(x[i]>=97 && x[i] <=122)//lowercase -> uppercase
                x[i]-=32;


        f1=open("upper-write",O_WRONLY);
        write( f1, &x, sizeof( x ) );
        printf( "[To upper] Changed txt send to [Write] (%s).\n" ,x);
        close( f1 );
    }
}

我認為您需要了解一些知識才能理解問題。 首先,在fork() ,不能保證首先運行哪個進程。 其次,如果管道的另一端未打開以進行寫入,則read()立即返回零值。

您指望以一定順序運行的進程,以便在進行任何讀取之前,管道在兩側都打開。 由於這並不總是發生,因此read()並不總是阻塞。

您可以通過在fork()之前打開所有管道的兩端來解決此問題。 所有進程將在管道的兩端都有文件描述符。 只需在相應進程中不需要的文件描述符上調用close()

您確定不是因為您的非掃描進程沒有關閉stdin嗎? 您可能想要在分叉之后執行類似“ close(0)”的操作。

另外,還有popen(),這種東西可能很有趣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM