[英]C system calls pipe, fork, and execl
我派生了一個子進程,並在它們之間創建了管道,並能夠將參數argv [1]發送給子進程。 我希望孩子使用argv [1]提供的文件名並執行execl(“ / bin / cat”,“ cat”,(char *)0); 如何將通過管道傳遞給子級的文件名路由到execl?
隨函附上我的代碼,以提高清晰度:
int main(int argc, char ** argv){
int fds[2];
char buffer[100];
int status;
if(pipe(fds) == -1){
perror("pipe creation failed");
exit(EXIT_FAILURE);
}
switch (fork()){
case 0://child
close(fds[1]); //close stdout so can only do stdin
read(fds[0],buffer,strlen(argv[1]));
printf("from parent: %s\n",argv[1]);
execl("/bin/cat","cat",(char*)0);
perror("cat failed");
exit(20);
break;
case -1: //fork failure
perror("fork failure");
exit(EXIT_FAILURE);
default: //parent
close(fds[0]); //close stdin so only can do stdout
write(fds[1],argv[1], strlen(argv[1]));
}
return (EXIT_SUCCESS);
}
當fork()
保留argv[1]
時,為什么要通過管道寫入文件名?
您無需根據緩沖區長度來檢查讀取長度。
您沒有傳輸尾隨的nul( strlen()
不包含它),因此文件名字符串在buffer
的終止符未初始化。 將+1
附加到所有strlen()
值以更正該值。 然后,
execl("/bin/cat","cat",buffer,(char*)0);
將執行您所要求的操作,但是您已經關閉了stdout
因此cat
(不是execl
)將失敗,並且您沒有檢查其退出代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.