写一个dup2功能同样的函数,不能调用 fcntl 函数,而且要有出错处理

实现的时候用到系统原来的dup函数

// mydup2.c
// 2015/08/17    Lucifer Zhang    version1.0
// write my own dup2 function
// use dup() function when inplementation

#include <unistd.h> // include dup()
#include <stdio.h>
#include <stdlib.h>

#define OPEN_MAX 256
/*
 * when the descriptor is negative or greater than OPEN_MAX, will make a errro
 * */

int my_dup2(int fd, int newfd);

int main(int argc, char *argv[])
{
    int newfd, return_fd;

    if (argc != 2) {
        printf("usage: a.out test.txt\n");
        exit(0);
    }
    printf("Please input the descriptor than you want to set: ");
    scanf("%d", &newfd);

    // open a file
    int fd = open(argv[1], 0);
    if (fd == -1) {
        perror(argv[1]); // print error msg
        exit(0);
    }

    printf("old descriptor is: %d\n", fd);
    return_fd = my_dup2(fd, newfd);
    printf("new descriptor is: %d\n");
    close(fd);
    close(return_fd);

    exit(0);
}

int my_dup2(int fd, int newfd)
{
    int count = 0;
    int fdarry[newfd]; // record opened descriptor

    if (newfd < 0 || newfd > OPEN_MAX) {
        printf("the new descriptor error!\n");
        exit(0);
    }

    // dup() return the lowest-numbered available file descriptor
    if ((fdarry[count] = dup(fd)) == -1) {
        printf("dup() function error!\n");
        exit(0);
    } else { // test old file descriptor if can be used
        close(fdarry[count]);
    }

    // if fd equals newfd, then dup2 returns newfd without closing it
    if (fd == newfd) {
        return fd;
    }

    close(newfd); // close

    // the main implementation
    for (count = 0; count <= newfd; ++count) {
        if ((fdarry[count] = dup(fd)) == -1) {
            printf("dup() funciont error!\n");
            exit(0);
        } else {
            printf("the descriptor is: %d\n", fdarry[count]);
            if (fdarry[count] == newfd) {
                break;
            }
        }
    }

    for (count = 0; count <= newfd; ++count) {
        if (fdarry[count] == newfd) {
            return fdarry[count];
        } else {
            close(fdarry[count]);
        }
    }
}
时间: 2024-10-01 04:39:06

写一个dup2功能同样的函数,不能调用 fcntl 函数,而且要有出错处理的相关文章

逆向知识十一讲,识别函数的调用约定,函数参数,函数返回值.

逆向知识十一讲,识别函数的调用约定,函数参数,函数返回值. 在反汇编中,我们常常的会看到各种的函数调用,或者通过逆向的手段,单独的使用这个函数,那么此时,我们就需要认识一下怎么识别函数了. 一丶识别__cdecl 函数(俗称C Call),函数参数,函数返回值 首先写一个C Call的函数 1.返回值 int类型, 参数int 类型 高级代码: int __cdecl MyAdd(int a,int b) { return a + b; } int main(int argc, char* ar

c++ 如何把this指针传入成员函数 像全局函数一样调用成员函数

测试这个功能的初衷是测试boost里面的bind boost::bind((&A::sum), &a, _1, _2) 上面的代码是我boost bind及多线程这篇博客里面的一行代码.我就想boost是怎么做到这样调用一个类的成员函数的.其实成员函数和全局函数无非就是差一个this指针参数.给传进去不就也可以调用了.然而并没有那么简单.看了boost的源码表示太长了.没怎么看懂 然后就自己写代码测试了一下.还用了汇编.. 代码参考  http://www.cppblog.com/woai

函数的返回值、函数的调用、函数的参数

1.函数的返回值 ''' 1.什么是返回值 返回值是一个函数的处理结果, 2.为什么要有返回值 如果我们需要在程序中拿到函数的处理结果做进一步的处理,则需要函数必须有返回值 3.函数的返回值的应用 函数的返回值用return去定义 格式为: return 值 --------(值可以是是以数据类型) 注意: 1.return是一个函数结束的标志,函数内可以有多个return, 但只要执行一次,整个函数就会结束运行------即函数下面有再多代码也不会被执行 2.return 的返回值无类型限制,

匿名函数立即调用的函数表达式 -IIFE(Immediately-Invoked Function Expression)

javascript 匿名函数有哪几种执行方式: ( function() {}() ); ( function() {} )(); [ function() {}() ]; ~ function() {}(); ! function() {}(); + function() {}(); - function() {}(); delete function() {}(); typeof function() {}(); void function() {}(); new function() {

Java 测试:写一个注册功能

|--需求说明 |--实现思路 见代码注释 |--代码内容 1 import java.util.Scanner; 2 3 /** 4 * @auther::9527 5 * @Description: 第八题 6 * @program: 多线程 7 * @create: 2019-08-10 09:40 8 */ 9 public class Eighth { 10 static Scanner scanner = new Scanner(System.in); 11 12 public st

函数里面有函数叫函数的闭包:子函数可以调用父函数变量,如果子函数找不到变量,那么整条作用域链的变量都会被保存

1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 5 <title>无标题文档</title> 6 <script> 7 //作用域 8 var a=0; 9 10 function abc(){ 11 var a=1; 1

练手例子_main函数、调用其他函数、输入字符保存

# hello3.pyimport hello4 person = {'Alice': 13, 'Bob': 35, 'May': 56, 'Lin': 29}body_name = ['head', 'body', 'hand', 'leg', 'foot'] # 找出想要的字符串def number_name(): n = int(input('Input a number:\n')) if 0 < n < 5: print(body_name[n]) else: print("

java如何在函数中调用主函数的数组

import javax.swing.JOptionPane; public class Test { /** * @zdz */ public static void main(String[] args) { double aArray[]= new double[]{1,2,3,4,5}; printArray(aArray); } public static void printArray(double aArray[]) { String output=""; aArray[

daemon_init函数:调用该函数把普通进程转变为守护进程

#include <unistd.h> #include <syslog.h> #include <fcntl.h> #include <signal.h> #define MAXFD 64 extern int daemon_proc; /* defined in error.c */ int daemon_init(const char *pname, int facility) { int i; pid_t pid; if ( (pid = fork(