انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => انجمن عمومی => نویسنده: شایان در 13 بهمن 1386، 05:58 ب‌ظ

عنوان: پایپ دو طرفه در پوسته‌ی سیستم عامل(حل شد)
ارسال شده توسط: شایان در 13 بهمن 1386، 05:58 ب‌ظ
کسی می‌دونه چه جوری می‌شه یک پایپ دو طرفه در پوسته(shell)  درست کرد
می‌خوام دو تا برنامه به نام های a  و b  این گونه باشند که خروجی a ورودی b و ورودی a  خروجی b باشد ( همان دستور a| b اما دوطرفه اش)
عنوان: پاسخ به: پایپ دو طرفه در پوسته‌ی سیستم عامل
ارسال شده توسط: ابراهیم در 13 بهمن 1386، 06:25 ب‌ظ
سلام،
لوله (pipe) اساساً یک‌طرفه هست.
بخش REDIRECTION از man bash ر
عنوان: پاسخ به: پایپ دو طرفه در پوسته‌ی سیستم عامل
ارسال شده توسط: شایان در 13 بهمن 1386، 09:37 ب‌ظ
خب من احتیاج به double directing دارم. کسی راه حلی نداره واسه این کار؟‌
عنوان: پاسخ به: پایپ دو طرفه در پوسته‌ی سیستم عامل
ارسال شده توسط: platoali در 13 بهمن 1386، 10:10 ب‌ظ
این چه جنونیه!!!!!

بگو دقیقا می خواهی چه کار کنی. شاید بتوانیم یک راه حل براش پیدا کنیم. :)
عنوان: پاسخ به: پایپ دو طرفه در پوسته‌ی سیستم عامل
ارسال شده توسط: شایان در 13 بهمن 1386، 10:17 ب‌ظ
یک برنامه نوشته شده که با کاربر به مکالمه می‌پردازد برای تست کردن آن نیاز به همچین چیزی دارم. یعنی دو برنامه باید مکالمه کنند.
عنوان: پاسخ به: پایپ دو طرفه در پوسته‌ی سیستم عامل
ارسال شده توسط: Saied در 13 بهمن 1386، 11:28 ب‌ظ
شاید مکانیزم Message Queue بتونه کمکت کنه. البته نمی دونم که آیا این مکانیزم توی بش هست یا نه؟ اگه نبود خودت باید توی ۲ تا برنامه قرار بدی
عنوان: پاسخ به: پایپ دو طرفه در پوسته‌ی سیستم عامل
ارسال شده توسط: ابراهیم در 14 بهمن 1386، 05:28 ب‌ظ
یک راه این هست که از socket استفاده کنی. مثلاً با استفاده از netcat.
عنوان: پاسخ به: پایپ دو طرفه در پوسته‌ی سیستم عامل
ارسال شده توسط: شایان در 14 بهمن 1386، 06:56 ب‌ظ
با جاوا بلدم با Socket این کار رو بکنم ولی راه ساده تر می‌خوام.
توی irc اوبونتو این سوال رو پرسیدم یکی یه راهی گفت که منجر به این شد:‌

mkfifo q1
mkfifo q2
که q1 و q2 دو تا پایپ فایل میشن در ادامه سعی کردم با این کد ها از اون ها استفاده کنم:‌

#include<fstream>
#include<iostream>
using namespace std;

ofstream fout("q2");
ifstream fin("q1");

int main(){
string str;
fin >> str;
return 0 ;
}


#include<iostream>
#include<fstream>
using namespace std;

ofstream fout("q1");
ifstream fin("q2");

int main(){
fout << "" << endl;
return 0 ;

}

اما با این که پایپ یک طرفه با اون ها به راحتی انجام میشه،‌ پایپ دوطرفه با این برنامه‌ها چیزی جز dead lock نصیبم نکرد.
خیلی بده که توی اینترنت هم چیز بدرد بخوری در این مورد پیدا نکردم. ](*,)

راستی netcat نمیدونم چیه اگر ممکنه توضیح بدید
با تشکر.

ویرایش:‌ سعی می‌کنم ببینم این netcat چی کاره است ;)
عنوان: پاسخ به: پایپ دو طرفه در پوسته‌ی سیستم عامل
ارسال شده توسط: ابراهیم در 14 بهمن 1386، 07:48 ب‌ظ
با همون mkfifo برات مثالی نوشتم. با دقت بخونیش متوجه می‌شی:

salam.sh:
#!/bin/bash

for i in {1..10}
do
        echo Gholam $i
done

for i in {1..10}
do
        read x && echo Salaam $x >>salam.txt
done

kalam.sh
#!/bin/bash

while read f
do
        echo Kalaam $f
done

connector.sh:
#!/bin/bash

# generate some random file name
temp=`tempfile`
rm -f $temp

# create a fifo
mkfifo $temp

# open FIFO for read and write into a file with descriptor number 3
exec 3<>$temp

# run salam.sh and kalam.sh connecting each one's output to other's input
./salam.sh <&3 | ./kalam.sh >&3

# close the file
exec 3<&-

# remove the FIFO from file system
rm -f $temp

توضیح:
salam.sh و kalam.sh می‌خوان با هم صحبت کنن. یک connector.sh می‌سازیم که این دو تا ر
عنوان: پاسخ به: پایپ دو طرفه در پوسته‌ی سیستم عامل(حل شد)‌
ارسال شده توسط: شایان در 15 بهمن 1386، 01:49 ق‌ظ
حل شد \\:D/ \\:D/ \\:D/
خیلی ممنون ابراهیم عزیز
کمک بزرگی به من کردی
حتماً‌ در مراسم اسکار بعدی به شما رای می‌دم ;D ;D
راستی میشه بگید این جور کد ها رو می‌تونم از کجا پیدا کنم؟ منبع این چیزی که نوشتید چی بوده
چون من  کل اینترنت رو گشتم ولی پیدا نشد
عنوان: پاسخ به: پایپ دو طرفه در پوسته‌ی سیستم عامل(حل شد)
ارسال شده توسط: ابراهیم در 15 بهمن 1386، 11:15 ق‌ظ
دست‌نویسی پوسته (shell scripting) یاد بگیرید.
این کدها ر