使用消息队列fork + execlp + ftok

时间:2013-07-27 15:27:39

标签: c

这里的主要目的是通过执行thise命令创建一个消息队列:./ create_msg_queue fileForQueue

如果文件不存在,我们想要创建文件fileForQueue。

关于我的代码,如果文件不存在,我会收到此错误

  

ftok:没有这样的文件或目录

那么怎样才能创建这个文件BEFORE使用文件名调用ftok()?

提供代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

// IPC and KEYS -------------
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/wait.h>
//---------------------------

#define _XOPEN_SOURCE

// message structure
typedef struct {

    // id message
    long type;

    // Size : 12 bytes
    double mesure;
    pid_t pidClient;

} message_t;

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

    key_t key;
    message_t message;
    int file;
    int pid;

    // Check arg number
    if (argc != 2) {
       fprintf(stderr, "Syntaxe : %s fichier_clé\n",argv[0]);
       exit(EXIT_FAILURE);
    }

    // Create the empty file given in parameter
    if ((pid = vfork()) == -1)
    {  
         perror("fork");
         exit(1);
    }

    if (pid)
    {   
         // code replacement to create the FILE
         execlp("touch", "touch", argv[1], NULL);
         perror("execlp"); 
         exit(1);
    }else
    {
        // Trying to wait for the forked() process to finish its file creation
        wait (NULL);

            // I GET ERROR HERE IF THE FILE DON'T EXIST BEFORE I LAUNCH THE PROGRAM
        // Create key with the file given in parameter and then created
        if ((key = ftok(argv[1], 0)) == -1) {

            // errNo value
            perror("ftok");
            exit(EXIT_FAILURE);
        }

        // Create message queue
        if ((file = msgget(key, IPC_CREAT | 0666)) == -1) {
           perror("msgget");
           exit(EXIT_FAILURE);
        }

        // Registering message content
        message.type = 1;
        message.mesure = -1;
        message.pidClient = getpid();

            // Sending message
        if (msgsnd(file, (void *) & message, 12, 0) <0) {
           perror("msgsnd");
           exit(EXIT_FAILURE);
        }


    }
    return EXIT_SUCCESS;
}

提前感谢您的帮助。我很挣扎:)。

1 个答案:

答案 0 :(得分:0)

key_t ftok(const char *path, int id);


ftok(argv[1], 0))
  

只有id的低位8位才有意义。的行为   如果这些位为0,则未指定ftok()。

另请注意,您必须

#define _XOPEN_SOURCE

一开始