[英]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.