fork應用---子程序呼叫execve
//open.c 檔案
1.父程序中開啟一個現有檔案123.c,fork出一個子程序
2.子程序中呼叫execve函式,新的程序替換子程序
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
void main()
{
int fd = open("123.c",O_RDONLY);
printf ("%d\n",fd);
if(fd == -1)
{
perror("file open:\n");
close(fd);
return;
}
pid_t pid = fork();
if(pid == 0 )
{
char s[100];
memset(s,0,sizeof(s));
sprintf(s,"%d",fd);
char* argv[] = {"read",s,NULL};
if( -1 == execve("read" ,argv,NULL))
{
perror("execve failed!\n");
close(fd);
return;
}
}
if(pid >0)
{
printf("parent process\n");
close(fd);
return;
}
if(pid<0)
{
perror("fork failed:\n");
close(fd);
return ;
}
}
//read.c
1.將fd 作為main 函式的引數傳遞給execve 呼叫的程序
2.讀取父程序中開啟的檔案123.c,由於fork出的子程序與父程序共享檔案描述符。只有父子程序中同時關閉fd才能真正關閉檔案,因為當前對檔案的引用計數為2。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
int main(int argc,char* argv[])
{
if(argc <2)
{
printf("no file to open for reading!\n");
return -1;
}
if(argv[1] == NULL)
{
printf("file does not exist!\n");
return EXIT_FAILURE ;
}
int fd = atoi(argv[1]);
printf("file description is %d\n",fd);
char buf[1024];
memset(buf,0,sizeof(buf));
read(fd,buf,sizeof(buf));
printf("%s\n",buf);
close(fd);
return EXIT_SUCCESS;
}
最後,附上makefile檔案
.SUFFIXES:.c .o
CC=gcc
SRCS1=open.c
SRCS2=read.c
OBJS1=$(SRCS1:.c=.o)
OBJS2=$(SRCS2:.c=.o)
EXEC1=open
EXEC2=read
start:$(OBJS1) $(OBJS2)
$(CC) -o $(EXEC1) $(OBJS1)
$(CC) -o $(EXEC2) $(OBJS2)
@echo '---------------success---------------'
.c.o:
$(CC) -o [email protected] -c $<
.PHONY : clean
clean:
-rm -f $(OBJS1)
-rm -f $(OBJS2)
-rm -f core*
說明1:.PHONY意思表示clean是一個“偽目標”,。而在rm命令前面加了一個小減號的意思就是,也許某些檔案出現問題,但不要管,繼續做後面的事。
說明2:clean的規則不要放在檔案的開頭,不然,這就會變成make的預設目標,不成文的規矩是——“clean從來都是放在檔案的最後”。
相關推薦
fork應用---子程序呼叫execve
//open.c 檔案 1.父程序中開啟一個現有檔案123.c,fork出一個子程序 2.子程序中呼叫execve函式,新的程序替換子程序 #include <stdio.h> #
2.fork建立子程序:vfork
getpid/getppid getpid 獲取當前程序id getppid 獲取當前程序的父程序的id fork pid_t fork() 1.為什麼fork有兩個返回值? 因為這兩個返回值是由不同的程序return出來的,而不是由一個fork函式返回兩個數。 (fork
fork之後子程序到底複製了父程序什麼
原文地址:http://blog.csdn.net/xy010902100449/article/details/44851453 #include<stdio.h> #include<string.h> #include&l
linux的子程序呼叫exec( )系列函式
exec( )函式族 : 下面我們來看看一個程序如何來啟動另一個程式的執行。在Linux中要使用exec函式族。系統呼叫execve()對當前程序進行替換,替換者為一個指定的程式,其引數包括檔名(filename)、引數列表(argv)以及環境變數(envp)。exec函式族當然不止一個,但它們大致相同,
關於fork建立子程序的一些疑惑
Python中執行 os.fork() 會建立 一個子程序,程序號為0 import os import time ret = os.fork() if ret == 0: while T
fork呼叫後,子程序與父程序是否共享變數
回顧fork呼叫 fork系統呼叫從已存在的程序中生成一個新的程序,這個新的程序就是子程序,我們可以通過fork系統呼叫的返回值來區分子程序還是父程序。 一個程序,包括程式碼、資料和分配給程序的資源。fork()函式通過系統呼叫建立一個與原來程序幾乎完全相
應用程序實現對其他應用程式的呼叫
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
fork -- 子程序共享父程序開啟的檔案描述符
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #define FILE_PATH "file_point" int main(int a
python子程序模組subprocess詳解與應用例項 之三
二、應用例項解析 2.1 subprocess模組的使用 1. subprocess.call subprocess.call([“ls”, “-l”]) 0 subprocess.call(“ex
python子程序模組subprocess詳解與應用例項 之二
1.2. Popen 物件 Popen類的例項有下列方法: 1. Popen.poll() 檢查子程序是否已經結束,設定並返回返回碼值。 2. Popen.wait() 等待子程序結束,設定並返回返回碼值。 WARNING: 當使用 stdout=P
python子程序模組subprocess詳解與應用例項 一
一、subprocess 模組簡介 subprocess最早是在2.4版本中引入的。 subprocess模組用來生成子程序,並可以通過管道連線它們的輸入/輸出/錯誤,以及獲得它們的返回值。 它用來代替多箇舊模組和函式: os.system os.sp
作業系統-關於fork&父程序&子程序
前言 這學期在學作業系統,目前感覺還是挺有意思的。 作業系統老師:“鼓勵你們大開腦洞多試試,會有各種奇異的結果,但是最後居然都能解釋出來。” 本文是根據課上講解+自行實踐寫的。 測試環境:Ubuntu 正文 關於fork()的3種返回值
python建立子程序的幾種常用方式(fork, Process,程序池)
linux下使用fork()建立子程序 Linux 作業系統提供了一個 fork() 函式用來建立子程序,這個函式很特殊,呼叫一次,返回兩次,因為作業系統是將當前的程序(父程序)複製了一份(子程序),然後分別在父程序和子程序內返回。子程序永遠返回0,而父程
python呼叫外部子程序,通過管道實現非同步標準輸入和輸出的互動
我們通常會遇到這樣的需求:通過C++或其他較底層的語言實現了一個複雜的功能模組,需要搭建一個基於Web的Demo,方法查詢資料。由於Python語言的強大和簡潔,其用來搭建Demo非常合適,Flask框架和jinja2模組功能為python提供了方便的web開發能力。同時,python能夠很方便的同其他語言
Linux生成子程序函式fork()
一片非常詳細的文章:http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/create.html #include <stdio.h> #include <stdlib.h> #include <
Android四大元件應用系列5——使用AIDL實現跨程序呼叫Service
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstan
android應用建立子程序的方法探究
android應用建立子程序的方法探究 1:前言 android應用開發,當前大多數軟體還是停留在java層進行開發,然而android真正可玩的地方,偏偏是本地語言c與c++,藉助JNI這個橋樑,可以使得java呼叫到本地函式,本文則從建立子程序,來進行探究andro
valgrind跟蹤fork出的子程序-debug除錯
valgrind --leak-check=full --trace-children=yes --undef-value-errors=no --track-fds=yes --num-callers=50 --lo
一個迴圈裡fork出的子程序個數
[[email protected] fork]$ ./exe pid:4071 ------ 問以下程式碼的執行結果 #include <stdio.h> #include <sys/types.h> #include <unist
作業系統-關於fork&父程序&子程序
前言 這學期在學作業系統,目前感覺還是挺有意思的。 作業系統老師:“鼓勵你們大開腦洞多試試,會有各種奇異的結果,但是最後居然都能解釋出來。” 本文是根據課上講解+自行實踐寫的。 測試環境:Ubuntu 正文 關於fork()的3種返回值 這裡提到的fork