1. 程式人生 > >fork應用---子程序呼叫execve

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