-
ایجاد fork و pipe
سلام
من بايد برنامه اي در محيط لينوكس به زبان سي بنويسم
پروسس پدر بايد اي دي خود را در بافر بنويسد
واين برنامه بايد به چند تا پروسس فرزند اجازه دهد كه يكي يكي به يك بافر دست يابند و اي دي پدررا بخوانند
منبع معرفي شده به من لاتين است ونياز مند كمك افرادي هستم كه اطلاعات دارند
تا حدودي پيش رفته ام و كدي پيدا كرده ام كه فكر مي كنم به دردم مي خورد
ولي بعضي از خطوط را نمي فهمم
كد من اين است:
[html]
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <limits.h>
#define BUFSZ PIPE_BUF
void err_quit(char *msg);
int main (int argc, char *argv[])
{
int fd[2];
int fdin;
char buf[BUFSZ];
int pid, len;
if ((pipe(fd))<0)
err_quit("pipe");
if ((pid=fork())<0)
err_quit("fork");
if (pid ==0)
{
close (fd[1]);
while((len = read (fd[0],buf, BUFSZ))>0)
write (STDOUT_FILENO,buf, len);
close(fd[0]);
}
else
{
close(fd[0]);
if ((fdin = open(argv[1],O_RDONLY))<0)
{
perror("open");
write (fd[1],"123\n",4);
}
else
{
while((len = read (fdin , buf, BUFSZ))>0)
{
write(fd[1],buf, len);
close(fdin);
}
close(fd[1]);
}
waitpid(pid, NULL,0);
exit(EXIT_SUCCESS);
}
void err_quit(char * msg)
{
perror(msg);
exit(EXIT_FAILURE);
}
[/html]
آيا با تابع فورك fork فرايند پدر و فرزند با هم توليد مي شوند؟
چند تا فرايند فرزند توليد مي شوند؟
چطوري بيش از يك فرايند فرزند توليد كنم چون فرايند ها بايد يكي يكي به بافر دست يابند و انرا بخوانند؟
به اين كد چه چيزي اضافه كنم تا بعد از ساخت فرايند پدر اي دي پدر ارا در بافر بنويسد
چون اي دي از نوع عدد است آيا بافر را بايد از نوع عدد int تعريف كنم ايرادي پيش نمي ا يد؟
لطف مي كنيد درمورد خطوطي نوشته ام توضيح دهيد
[HTML]
write (STDOUT_FILENO,buf, len);
[/HTML]
[HTML]
if ((fdin = open(argv[1],O_RDONLY))<0)
[/HTML]
[HTML]
waitpid(pid, NULL,0);
[/HTML]
از طریق زیر:
[HTML]
while((len = read (fdin , buf, BUFSZ))>0)
{
write(fd[1],buf, len);
close(fdin);
[/HTML]
برنامه در حال پر کردن بافر است ولی من می خواهم که بافر با ای دی پدر پر شود چه کدی بنویسم و یا چه تغیییری ایجاد کنم که این کا ررابکند
تشکر
-
دوباره سلام.
تابع fork ابتدایی ترین راه برای ایجاد یک process هست. وقتی از fork استفاده میکنین یک
child-process ایجاد میشه. البته به طور کاملتر باید بگم که current-process به دو process شکسته میشه.
به یک parent-process و یک child-process . میتونید از fork چند بار استفاده کنید.
با استفاده از تابع getppid میتونید parent-ID رو برگردونید.
بافر شما بهتره از نوع Integer باشه تا دچار مشکل نشید.
1-
کد:
write (STDOUT_FILENO,buf, len);
این کد محتویات buf رو به تعداد len در STDOUT_FILENO کپی میکنه و در حقیقت در خروجی نمایش میده.
2-
کد:
if ((fdin = open(argv[1],O_RDONLY))<0)
این کد یک فایل رو در حالت Read-Only باز میکنه. [1]argv اسم فایل مورد نظر هست.که از cmd-line
دریافت میشه. اگه این تابع نتونه فایل مورد نظر رو باز کنه مقداری که برمیگردونه برابر -1 هست.
3-
کد:
waitpid(pid, NULL,0);
این کد باعث میشه برنامه تا تموم شدن کار child-process که pid هست صبرکنه.
4-
کد:
while((len = read (fdin , buf, BUFSZ))>0)
{
write(fd[1],buf, len);
close(fdin);
}
این کد به معنی هست: تا زمانی مقدار برگشتی تابع read بزرگتر از 0 باشه مقدار buf رو در [1]fd مینوسه.
در حقیقت اول از ورودی خونده میشه (fdin ) و در buf قرار داده میشه و بعد این مقدار در فایل [1]fd نوشته
میشه.